98 if (
_rd_->variablesSequence().exists(curVar))
99 _rd_->manager()->moveTo(curVar,
_rd_->variablesSequence().size() - 1);
102 if (
_rd_->isTerminalNode(
_rd_->root())) {
104 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
107 NodeId newSonId =
_rd_->manager()->addTerminalNode(newVal);
108 _rd_->manager()->setRootNode(newSonId);
110 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);
116 if (
_rd_->node(
_rd_->root())->nodeVar() == curVar) {
119 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
122 NodeId newSonId =
_rd_->manager()->addTerminalNode(newVal);
124 _rd_->manager()->eraseNode(
_rd_->root(), newSonId,
false);
126 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);
132 std::vector< NodeId > filo;
133 filo.push_back(
_rd_->root());
135 while (!filo.empty()) {
136 NodeId curNodeId = filo.back();
141 for (
Idx modality = 0; modality < curNode->
nodeVar()->domainSize(); ++modality) {
142 NodeId oldSonId = curNode->
son(modality);
144 if (!visitedNode.
exists(oldSonId)) {
145 NodeId newSonId = oldSonId;
147 if (!
_rd_->isTerminalNode(oldSonId)) {
148 if (
_rd_->node(oldSonId)->nodeVar() != curVar) {
149 filo.push_back(oldSonId);
153 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize();
157 newSonId =
_rd_->manager()->addTerminalNode(newVal);
159 _rd_->manager()->eraseNode(oldSonId, newSonId,
false);
160 _rd_->manager()->setSon(curNodeId, modality, newSonId);
164 GUM_ELEMENT newVal =
_neutral_, oldVal =
_rd_->nodeValue(oldSonId);
165 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
168 newSonId =
_rd_->manager()->addTerminalNode(newVal);
169 _rd_->manager()->setSon(curNodeId, modality, newSonId);
172 visitedNode.
insert(oldSonId, newSonId);
175 if (
_rd_->node(curNodeId)->son(modality) != visitedNode[oldSonId])
176 _rd_->manager()->setSon(curNodeId, modality, visitedNode[oldSonId]);
181 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);