97 if (
_rd_->variablesSequence().exists(curVar))
98 _rd_->manager()->moveTo(curVar,
_rd_->variablesSequence().size() - 1);
101 if (
_rd_->isTerminalNode(
_rd_->root())) {
103 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
106 NodeId newSonId =
_rd_->manager()->addTerminalNode(newVal);
107 _rd_->manager()->setRootNode(newSonId);
109 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);
115 if (
_rd_->node(
_rd_->root())->nodeVar() == curVar) {
118 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
121 NodeId newSonId =
_rd_->manager()->addTerminalNode(newVal);
123 _rd_->manager()->eraseNode(
_rd_->root(), newSonId,
false);
125 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);
131 std::vector< NodeId > filo;
132 filo.push_back(
_rd_->root());
134 while (!filo.empty()) {
135 NodeId curNodeId = filo.back();
140 for (
Idx modality = 0; modality < curNode->
nodeVar()->domainSize(); ++modality) {
141 NodeId oldSonId = curNode->
son(modality);
143 if (!visitedNode.
exists(oldSonId)) {
144 NodeId newSonId = oldSonId;
146 if (!
_rd_->isTerminalNode(oldSonId)) {
147 if (
_rd_->node(oldSonId)->nodeVar() != curVar) {
148 filo.push_back(oldSonId);
152 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize();
156 newSonId =
_rd_->manager()->addTerminalNode(newVal);
158 _rd_->manager()->eraseNode(oldSonId, newSonId,
false);
159 _rd_->manager()->setSon(curNodeId, modality, newSonId);
163 GUM_SCALAR newVal =
_neutral_, oldVal =
_rd_->nodeValue(oldSonId);
164 for (
Idx curVarModality = 0; curVarModality < curVar->
domainSize(); ++curVarModality)
167 newSonId =
_rd_->manager()->addTerminalNode(newVal);
168 _rd_->manager()->setSon(curNodeId, modality, newSonId);
171 visitedNode.
insert(oldSonId, newSonId);
174 if (
_rd_->node(curNodeId)->son(modality) != visitedNode[oldSonId])
175 _rd_->manager()->setSon(curNodeId, modality, visitedNode[oldSonId]);
180 if (
_rd_->variablesSequence().exists(curVar))
_rd_->erase(*curVar);