146 while (fite !=
_DG1_->variablesSequence().endSafe()
147 && site !=
_DG2_->variablesSequence().endSafe()) {
150 if (
_rd_->variablesSequence().exists(*fite)) {
157 if (
_rd_->variablesSequence().exists(*site)) {
180 if (*fite == *site) {
197 if (fite ==
_DG1_->variablesSequence().endSafe()) {
198 for (; site !=
_DG2_->variablesSequence().endSafe(); ++site)
199 if (!
_rd_->variablesSequence().exists(*site))
_rd_->add(**site);
201 for (; fite !=
_DG1_->variablesSequence().endSafe(); ++fite)
202 if (!
_rd_->variablesSequence().exists(*fite))
_rd_->add(**fite);
230 Idx varPos =
_rd_->variablesSequence().pos(*varIter);
232 const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
233 while (nodeIter !=
nullptr) {
234 short int* instantiationNeeded =
static_cast< short int*
>(
ALLOCATE(tableSize));
236 short int* varDescendant =
static_cast< short int*
>(
ALLOCATE(tableSize));
237 nodesVarDescendant.
insert(nodeIter->
element(), varDescendant);
239 instantiationNeeded[j] = (
short int)0;
240 varDescendant[j] = (
short int)0;
244 varDescendant[varPos] = (
short int)1;
245 for (
Idx modality = 0; modality < dg->node(nodeIter->
element())->nbSons(); ++modality) {
246 if (!dg->isTerminalNode(dg->node(nodeIter->
element())->son(modality))) {
247 short int* sonVarDescendant
248 = nodesVarDescendant[dg->node(nodeIter->
element())->son(modality)];
249 for (
Idx varIdx = 0; varIdx <
_nbVar_; varIdx++) {
250 varDescendant[varIdx] += sonVarDescendant[varIdx];
251 if (varDescendant[varIdx] && varIdx < varPos)
252 instantiationNeeded[varIdx] = (
short int)1;
263 const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
264 while (nodeIter !=
nullptr) {
265 for (
Idx modality = 0; modality < dg->node(nodeIter->
element())->nbSons(); ++modality) {
267 if (!dg->isTerminalNode(sonId)) {
268 for (
Idx varIdx = 0; varIdx <
_nbVar_; ++varIdx) {
269 if (dgInstNeed[nodeIter->
element()][varIdx] && nodesVarDescendant[sonId][varIdx]) {
270 dgInstNeed[sonId][varIdx] = (
short int)1;
280 it != nodesVarDescendant.
end();
285 nodesVarDescendant.
clear();
313 Idx lastInstVarPos) {
325 for (
Idx targetModa = 0; targetModa <
_targetVar_->domainSize(); ++targetModa)
327 return _rd_->manager()->addTerminalNode(newVal);
341 :
_rd_->variablesSequence().pos(
_DG1_->node(currentSituation.
DG1Node())->nodeVar());
348 :
_rd_->variablesSequence().pos(
_DG2_->node(currentSituation.
DG2Node())->nodeVar());
350 short int* instNeeded =
static_cast< short int*
>(
ALLOCATE(
sizeof(
short int) *
_nbVar_));
353 instNeeded[i] = dg1NeededVar[i] + dg2NeededVar[i];
356 double curSitKey = currentSituation.
key(instNeeded);
370 Idx leadVarPos =
_rd_->variablesSequence().size();
372 SetNodeFunction leadFunction =
nullptr;
374 bool sameVar =
false;
376 if (!
_DG1_->isTerminalNode(currentSituation.
DG1Node())) {
377 if (currentSituation.
varModality(dg1CurrentVarPos) != 0) {
381 ->son(currentSituation.
varModality(dg1CurrentVarPos) - 1));
383 newNode =
_compute_(currentSituation, lastInstVarPos);
394 leadNodeId = currentSituation.
DG1Node();
395 leadVarPos = dg1CurrentVarPos;
399 if (!
_DG2_->isTerminalNode(currentSituation.
DG2Node())) {
400 if (currentSituation.
varModality(dg2CurrentVarPos) != 0) {
404 ->son(currentSituation.
varModality(dg2CurrentVarPos) - 1));
406 newNode =
_compute_(currentSituation, lastInstVarPos);
416 if (leadVarPos == dg2CurrentVarPos) { sameVar =
true; }
418 if (leadVarPos > dg2CurrentVarPos) {
420 leadNodeId = currentSituation.
DG2Node();
421 leadVarPos = dg2CurrentVarPos;
431 for (
Idx varPos = lastInstVarPos + 1; varPos < leadVarPos; ++varPos) {
432 if (instNeeded[varPos]) {
436 for (
Idx modality = 0; modality < curVar->
domainSize(); modality++) {
439 sonsIds[modality] =
_compute_(currentSituation, varPos);
442 newNode =
_rd_->manager()->addInternalNode(curVar, sonsIds);
459 for (
Idx targetModa = 0; targetModa <
_targetVar_->domainSize(); ++targetModa)
462 _DG2_->nodeValue(
_DG2_->node(origDG2)->son(targetModa))));
463 newNode =
_rd_->manager()->addTerminalNode(newVal);
468 if (
_DG1_->isTerminalNode(origDG1)) {
471 for (
Idx targetModa = 0; targetModa <
_targetVar_->domainSize(); ++targetModa)
474 _DG2_->nodeValue(
_DG2_->node(origDG2)->son(targetModa))));
475 newNode =
_rd_->manager()->addTerminalNode(newVal);
483 for (
Idx targetModa = 0; targetModa <
_targetVar_->domainSize(); ++targetModa)
486 _DG2_->nodeValue(origDG2)));
487 newNode =
_rd_->manager()->addTerminalNode(newVal);
506 Idx varPos =
_rd_->variablesSequence().pos(curVar);
509 for (
Idx modality = 0; modality < curVar->
domainSize(); modality++) {
514 sonsIds[modality] =
_compute_(currentSituation, varPos);
517 newNode =
_rd_->manager()->addInternalNode(curVar, sonsIds);
530 const InternalNode* leaddgNode = leaddg->node(leadNodeId);
535 for (
Idx modality = 0; modality < curVar->
domainSize(); modality++) {
537 (currentSituation.*leadFunction)(leaddgNode->
son(modality));
539 sonsIds[modality] =
_compute_(currentSituation, leadVarPos);
542 newNode =
_rd_->manager()->addInternalNode(curVar, sonsIds);
Class used to manipulate context during Function Graph Operations.
const NodeId & DG2Node() const
Get DG2 diagram current explored Node.
void setDG2Node(const NodeId &)
Set DG2 diagram current explored Node.
const NodeId & DG1Node() const
Get DG1 diagram current explored Node.
void chgVarModality(Idx, Idx)
Changes given variable modality.
void setDG1Node(const NodeId &)
Set DG1 diagram current explored Node.
const double & key(short int *instNeeded)
Returns o4DGContext key.
Idx varModality(Idx)
Changes given variable modality.