147 while (fite !=
_DG1_->variablesSequence().endSafe()
148 && site !=
_DG2_->variablesSequence().endSafe()) {
151 if (
_rd_->variablesSequence().exists(*fite)) {
158 if (
_rd_->variablesSequence().exists(*site)) {
181 if (*fite == *site) {
198 if (fite ==
_DG1_->variablesSequence().endSafe()) {
199 for (; site !=
_DG2_->variablesSequence().endSafe(); ++site)
200 if (!
_rd_->variablesSequence().exists(*site))
_rd_->add(**site);
202 for (; fite !=
_DG1_->variablesSequence().endSafe(); ++fite)
203 if (!
_rd_->variablesSequence().exists(*fite))
_rd_->add(**fite);
231 Idx varPos =
_rd_->variablesSequence().pos(*varIter);
233 const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
234 while (nodeIter !=
nullptr) {
235 short int* instantiationNeeded =
static_cast< short int*
>(
ALLOCATE(tableSize));
237 short int* varDescendant =
static_cast< short int*
>(
ALLOCATE(tableSize));
238 nodesVarDescendant.
insert(nodeIter->
element(), varDescendant);
240 instantiationNeeded[j] = (
short int)0;
241 varDescendant[j] = (
short int)0;
245 varDescendant[varPos] = (
short int)1;
246 for (
Idx modality = 0; modality < dg->node(nodeIter->
element())->nbSons(); ++modality) {
247 if (!dg->isTerminalNode(dg->node(nodeIter->
element())->son(modality))) {
248 short int* sonVarDescendant
249 = nodesVarDescendant[dg->node(nodeIter->
element())->son(modality)];
250 for (
Idx varIdx = 0; varIdx <
_nbVar_; varIdx++) {
251 varDescendant[varIdx] += sonVarDescendant[varIdx];
252 if (varDescendant[varIdx] && varIdx < varPos)
253 instantiationNeeded[varIdx] = (
short int)1;
264 const Link< NodeId >* nodeIter = dg->varNodeListe(*varIter)->list();
265 while (nodeIter !=
nullptr) {
266 for (
Idx modality = 0; modality < dg->node(nodeIter->
element())->nbSons(); ++modality) {
268 if (!dg->isTerminalNode(sonId)) {
269 for (
Idx varIdx = 0; varIdx <
_nbVar_; ++varIdx) {
270 if (dgInstNeed[nodeIter->
element()][varIdx] && nodesVarDescendant[sonId][varIdx]) {
271 dgInstNeed[sonId][varIdx] = (
short int)1;
281 it != nodesVarDescendant.
end();
286 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.
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.
const NodeId & DG1Node() const
Get DG1 diagram current explored Node.