return true;\r
}\r
}\r
- //for star: check if all children are defined and have generalizations\r
- if( options::fmfFmcCoverSimplify() && c[index]==st ){\r
- //check if all children exist and are complete\r
- int num_child_def = d_child.size() - (d_child.find(st)!=d_child.end() ? 1 : 0);\r
- if( num_child_def==m->d_rep_set.getNumRepresentatives(tn) ){\r
- bool complete = true;\r
- for ( std::map<Node,EntryTrie>::iterator it = d_child.begin(); it != d_child.end(); ++it ){\r
- if( !m->isStar(it->first) ){\r
- if( !it->second.hasGeneralization(m, c, index+1) ){\r
- complete = false;\r
- break;\r
+ if( !options::fmfFmcInterval() || !c[index].getType().isInteger() ){\r
+ //for star: check if all children are defined and have generalizations\r
+ if( options::fmfFmcCoverSimplify() && c[index]==st ){\r
+ //check if all children exist and are complete\r
+ int num_child_def = d_child.size() - (d_child.find(st)!=d_child.end() ? 1 : 0);\r
+ if( num_child_def==m->d_rep_set.getNumRepresentatives(tn) ){\r
+ bool complete = true;\r
+ for ( std::map<Node,EntryTrie>::iterator it = d_child.begin(); it != d_child.end(); ++it ){\r
+ if( !m->isStar(it->first) ){\r
+ if( !it->second.hasGeneralization(m, c, index+1) ){\r
+ complete = false;\r
+ break;\r
+ }\r
}\r
}\r
- }\r
- if( complete ){\r
- return true;\r
+ if( complete ){\r
+ return true;\r
+ }\r
}\r
}\r
}\r
return d_data;\r
}else{\r
int minIndex = -1;\r
- Node st = m->getStar(inst[index].getType());\r
- if(d_child.find(st)!=d_child.end()) {\r
- minIndex = d_child[st].getGeneralizationIndex(m, inst, index+1);\r
- }\r
- Node cc = inst[index];\r
- if( cc!=st && d_child.find( cc )!=d_child.end() ){\r
- int gindex = d_child[ cc ].getGeneralizationIndex(m, inst, index+1);\r
- if (minIndex==-1 || (gindex!=-1 && gindex<minIndex) ){\r
- minIndex = gindex;\r
+ if( options::fmfFmcInterval() && inst[index].getType().isInteger() ){\r
+ for( std::map<Node,EntryTrie>::iterator it = d_child.begin(); it != d_child.end(); ++it ){\r
+ if( !m->isInterval( it->first ) ){\r
+ std::cout << "Not an interval during getGenIndex " << it->first << std::endl;\r
+ exit( 11 );\r
+ }\r
+ //check if it is in the range\r
+ bool inRange = true;\r
+ for( unsigned b=0; b<2; b++ ){\r
+ if( !m->isStar( it->first[b] ) ){\r
+ if( ( b==0 && it->first[b].getConst<Rational>() > inst[index].getConst<Rational>() ) ||\r
+ ( b==1 && it->first[b].getConst<Rational>() <= inst[index].getConst<Rational>() ) ){\r
+ inRange = false;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if( inRange ){\r
+ int gindex = it->second.getGeneralizationIndex(m, inst, index+1);\r
+ if( minIndex==-1 || (gindex!=-1 && gindex<minIndex) ){\r
+ minIndex = gindex;\r
+ }\r
+ }\r
+ }\r
+ }else{\r
+ Node st = m->getStar(inst[index].getType());\r
+ if(d_child.find(st)!=d_child.end()) {\r
+ minIndex = d_child[st].getGeneralizationIndex(m, inst, index+1);\r
+ }\r
+ Node cc = inst[index];\r
+ if( cc!=st && d_child.find( cc )!=d_child.end() ){\r
+ int gindex = d_child[ cc ].getGeneralizationIndex(m, inst, index+1);\r
+ if (minIndex==-1 || (gindex!=-1 && gindex<minIndex) ){\r
+ minIndex = gindex;\r
+ }\r
}\r
}\r
return minIndex;\r
}\r
}\r
\r
-\r
-bool EntryTrie::isCovered(FirstOrderModelFmc * m, Node c, int index) {\r
- if (index==(int)c.getNumChildren()) {\r
- return false;\r
- }else{\r
- TypeNode tn = c[index].getType();\r
- Node st = m->getStar(tn);\r
- if( c[index]==st ){\r
- //check if all children exist and are complete\r
- int num_child_def = d_child.size() - (d_child.find(st)!=d_child.end() ? 1 : 0);\r
- if( num_child_def==m->d_rep_set.getNumRepresentatives(tn) ){\r
- bool complete = true;\r
- for ( std::map<Node,EntryTrie>::iterator it = d_child.begin(); it != d_child.end(); ++it ){\r
- if( !m->isStar(it->first) ){\r
- if( !it->second.isComplete(m, c, index+1) ){\r
- complete = false;\r
- break;\r
- }\r
- }\r
- }\r
- if( complete ){\r
- return true;\r
- }\r
- }\r
- }\r
- if( d_child.find(c[index])!=d_child.end() ){\r
- return d_child[c[index]].isCovered(m, c, index+1);\r
- }else{\r
- return false;\r
- }\r
- }\r
-}\r
-\r
void EntryTrie::collectIndices(Node c, int index, std::vector< int >& indices ) {\r
if (index==(int)c.getNumChildren()) {\r
if( d_data!=-1 ){\r
if (d_et.hasGeneralization(m, c)) {\r
return false;\r
}\r
- //if( options::fmfFmcCoverSimplify() ){\r
- // if( d_et.isCovered(m, c, 0) ){\r
- // Trace("fmc-cover-simplify") << "Entry " << c << " is covered." << std::endl;\r
- // return false;\r
- // }\r
- //}\r
int newIndex = (int)d_cond.size();\r
if (!d_has_simplified) {\r
std::vector<int> compat;\r
if (gindex!=-1) {\r
return d_value[gindex];\r
}else{\r
+ Trace("fmc-warn") << "Warning : evaluation came up null!" << std::endl;\r
return Node::null();\r
}\r
}\r
bool last_all_stars = true;\r
Node cc = d_cond[d_cond.size()-1];\r
for( unsigned i=0; i<cc.getNumChildren(); i++ ){\r
- if( !m->isStar(cc[i]) ){\r
+ if( !m->isInterval(cc[i]) && !m->isStar(cc[i]) ){\r
last_all_stars = false;\r
break;\r
}\r
for( unsigned i=0; i<c.getNumChildren(); i++) {\r
Node ri = fm->getUsedRepresentative( c[i]);\r
children.push_back(ri);\r
- if (fm->isModelBasisTerm(ri)) {\r
- ri = fm->getStar( ri.getType() );\r
- }else{\r
- hasNonStar = true;\r
+ if( !options::fmfFmcInterval() || !ri.getType().isInteger() ){\r
+ if (fm->isModelBasisTerm(ri) ) {\r
+ ri = fm->getStar( ri.getType() );\r
+ }else{\r
+ hasNonStar = true;\r
+ }\r
}\r
entry_children.push_back(ri);\r
}\r
for (int i=0; i<(int)indices.size(); i++) {\r
fm->d_models[op]->addEntry(fm, entry_conds[indices[i]], values[indices[i]]);\r
}\r
- fm->d_models[op]->debugPrint("fmc-model", op, this);\r
- Trace("fmc-model") << std::endl;\r
+\r
\r
if( options::fmfFmcInterval() ){\r
Trace("fmc-interval-model") << "Changing to interval model, Before : " << std::endl;\r
}\r
std::map< int, std::map< int, Node > > changed_vals;\r
makeIntervalModel( fm, op, indices, 0, changed_vals );\r
- for( std::map< int, std::map< int, Node > >::iterator it = changed_vals.begin(); it != changed_vals.end(); ++it ){\r
- Trace("fmc-interval-model") << "Entry #" << it->first << " changed : ";\r
- for( std::map< int, Node >::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2 ){\r
- Trace("fmc-interval-model") << it2->first << " -> " << it2->second << ", ";\r
+\r
+ std::vector< Node > conds;\r
+ std::vector< Node > values;\r
+ for( unsigned i=0; i<fm->d_models[op]->d_cond.size(); i++ ){\r
+ if( changed_vals.find(i)==changed_vals.end() ){\r
+ conds.push_back( fm->d_models[op]->d_cond[i] );\r
+ }else{\r
+ std::vector< Node > children;\r
+ children.push_back( op );\r
+ for( unsigned j=0; j<fm->d_models[op]->d_cond[i].getNumChildren(); j++ ){\r
+ if( changed_vals[i].find(j)==changed_vals[i].end() ){\r
+ children.push_back( fm->d_models[op]->d_cond[i][j] );\r
+ }else{\r
+ children.push_back( changed_vals[i][j] );\r
+ }\r
+ }\r
+ Node nc = NodeManager::currentNM()->mkNode( APPLY_UF, children );\r
+ conds.push_back( nc );\r
+ Trace("fmc-interval-model") << "Interval : Entry #" << i << " changed to ";\r
+ debugPrintCond("fmc-interval-model", nc, true );\r
+ Trace("fmc-interval-model") << std::endl;\r
}\r
- Trace("fmc-interval-model") << std::endl;\r
+ values.push_back( fm->d_models[op]->d_value[i] );\r
+ }\r
+ fm->d_models[op]->reset();\r
+ for( unsigned i=0; i<conds.size(); i++ ){\r
+ fm->d_models[op]->addEntry(fm, conds[i], values[i] );\r
}\r
}\r
\r
+ Trace("fmc-model-simplify") << "Before simplification : " << std::endl;\r
+ fm->d_models[op]->debugPrint("fmc-model-simplify", op, this);\r
+ Trace("fmc-model-simplify") << std::endl;\r
\r
Trace("fmc-model-simplify") << "Simplifying " << op << "..." << std::endl;\r
fm->d_models[op]->simplify( this, fm );\r
- Trace("fmc-model-simplify") << "After simplification : " << std::endl;\r
- fm->d_models[op]->debugPrint("fmc-model-simplify", op, this);\r
- Trace("fmc-model-simplify") << std::endl;\r
+\r
+ fm->d_models[op]->debugPrint("fmc-model", op, this);\r
+ Trace("fmc-model") << std::endl;\r
}\r
}\r
}\r
Trace("fmc") << "Definition for quantifier " << f << " is : " << std::endl;\r
d_quant_models[f].debugPrint("fmc", Node::null(), this);\r
Trace("fmc") << std::endl;\r
- //consider all entries going to false\r
+\r
+ //consider all entries going to non-true\r
for (unsigned i=0; i<d_quant_models[f].d_cond.size(); i++) {\r
if( d_quant_models[f].d_value[i]!=d_true) {\r
Trace("fmc-inst") << "Instantiate based on " << d_quant_models[f].d_cond[i] << "..." << std::endl;\r
if (fmfmc->isStar(d_quant_models[f].d_cond[i][j])) {\r
hasStar = true;\r
inst.push_back(fmfmc->getModelBasisTerm(d_quant_models[f].d_cond[i][j].getType()));\r
+ }else if( fmfmc->isInterval(d_quant_models[f].d_cond[i][j])){\r
+ hasStar = true;\r
+ //if interval, find a sample point\r
+ if( fmfmc->isStar(d_quant_models[f].d_cond[i][j][0]) ){\r
+ if( fmfmc->isStar(d_quant_models[f].d_cond[i][j][1]) ){\r
+ inst.push_back(fmfmc->getModelBasisTerm(d_quant_models[f].d_cond[i][j][1].getType()));\r
+ }else{\r
+ Node nn = NodeManager::currentNM()->mkNode( MINUS, d_quant_models[f].d_cond[i][j][1],\r
+ NodeManager::currentNM()->mkConst( Rational(1) ) );\r
+ nn = Rewriter::rewrite( nn );\r
+ inst.push_back( nn );\r
+ }\r
+ }else{\r
+ inst.push_back(d_quant_models[f].d_cond[i][j][0]);\r
+ }\r
}else{\r
inst.push_back(d_quant_models[f].d_cond[i][j]);\r
}\r
Trace("fmc-exh") << "Exhaustive instantiate based on index " << c_index << " : " << c << " ";\r
debugPrintCond("fmc-exh", c, true);\r
Trace("fmc-exh")<< std::endl;\r
+ //set the bounds on the iterator based on intervals\r
+ for( unsigned i=0; i<c.getNumChildren(); i++ ){\r
+ if( fm->isInterval(c[i]) ){\r
+ for( unsigned b=0; b<2; b++ ){\r
+ if( !fm->isStar(c[i][b]) ){\r
+ riter.d_bounds[b][i] = c[i][b];\r
+ }\r
+ }\r
+ }\r
+ }\r
+ //initialize\r
if( riter.setQuantifier( f ) ){\r
//set the domains based on the entry\r
for (unsigned i=0; i<c.getNumChildren(); i++) {\r
if (riter.d_enum_type[i]==RepSetIterator::ENUM_DOMAIN_ELEMENTS) {\r
TypeNode tn = c[i].getType();\r
if( d_rep_ids.find(tn)!=d_rep_ids.end() ){\r
- if( fm->isStar(c[i]) ){\r
+ if( fm->isInterval(c[i]) || fm->isStar(c[i]) ){\r
//add the full range\r
}else{\r
if (d_rep_ids[tn].find(c[i])!=d_rep_ids[tn].end()) {\r
}\r
}\r
}\r
+ int addedLemmas = 0;\r
//now do full iteration\r
while( !riter.isFinished() ){\r
+ d_triedLemmas++;\r
Trace("fmc-exh-debug") << "Inst : ";\r
std::vector< Node > inst;\r
for( int i=0; i<riter.getNumTerms(); i++ ){\r
int ev_index = d_quant_models[f].getGeneralizationIndex(fm, inst);\r
Trace("fmc-exh-debug") << ", index = " << ev_index;\r
Node ev = ev_index==-1 ? Node::null() : d_quant_models[f].d_value[ev_index];\r
- bool successAdd = false;\r
if (ev!=d_true) {\r
InstMatch m;\r
for( int i=0; i<riter.getNumTerms(); i++ ){\r
m.set( d_qe, f, i, riter.getTerm( i ) );\r
}\r
Trace("fmc-exh-debug") << ", add!";\r
- d_triedLemmas++;\r
//add as instantiation\r
if( d_qe->addInstantiation( f, m ) ){\r
Trace("fmc-exh-debug") << " ...success.";\r
- d_addedLemmas++;\r
- successAdd = true;\r
+ addedLemmas++;\r
}\r
}\r
Trace("fmc-exh-debug") << std::endl;\r
int index = riter.increment();\r
Trace("fmc-exh-debug") << "Incremented index " << index << std::endl;\r
- if (index>=0 && successAdd && riter.d_enum_type[index]==RepSetIterator::ENUM_RANGE) {\r
+ if (index>=0 && riter.d_index[index]>0 && addedLemmas>0 && riter.d_enum_type[index]==RepSetIterator::ENUM_RANGE) {\r
Trace("fmc-exh-debug") << "Since this is a range enumeration, skip to the next..." << std::endl;\r
riter.increment2( index-1 );\r
}\r
}\r
+ d_addedLemmas += addedLemmas;\r
return true;\r
}else{\r
return false;\r
\r
void FullModelChecker::doCheck(FirstOrderModelFmc * fm, Node f, Def & d, Node n ) {\r
Trace("fmc-debug") << "Check " << n << " " << n.getKind() << std::endl;\r
- if( n.getKind() == kind::BOUND_VARIABLE ){\r
+ //first check if it is a bounding literal\r
+ if( n.hasAttribute(BoundIntLitAttribute()) ){\r
+ Trace("fmc-debug") << "It is a bounding literal, polarity = " << n.getAttribute(BoundIntLitAttribute()) << std::endl;\r
+ d.addEntry(fm, mkCondDefault(fm, f), n.getAttribute(BoundIntLitAttribute())==1 ? d_false : d_true );\r
+ }else if( n.getKind() == kind::BOUND_VARIABLE ){\r
d.addEntry(fm, mkCondDefault(fm, f), n);\r
- Trace("fmc-debug") << "Done with " << n << " " << n.getKind() << std::endl;\r
}\r
else if( n.getKind() == kind::NOT ){\r
//just do directly\r
}\r
else if( n.getNumChildren()==0 ){\r
Node r = n;\r
- if( !fm->hasTerm(n) ){\r
- r = getSomeDomainElement(fm, n.getType() );\r
+ if( !n.isConst() ){\r
+ if( !fm->hasTerm(n) ){\r
+ r = getSomeDomainElement(fm, n.getType() );\r
+ }\r
+ r = fm->getUsedRepresentative( r );\r
}\r
- r = fm->getUsedRepresentative( r);\r
d.addEntry(fm, mkCondDefault(fm, f), r);\r
}\r
else{\r
if( !v.isNull() && v.getKind()==kind::BOUND_VARIABLE ){\r
int j = getVariableId(f, v);\r
Trace("fmc-uf-process") << v << " is variable #" << j << std::endl;\r
- if (!fm->isStar(cond[j+1])) {\r
+ if (!fm->isStar(cond[j+1]) && !fm->isInterval(cond[j+1])) {\r
v = cond[j+1];\r
}else{\r
bind_var = true;\r
if (bind_var) {\r
Trace("fmc-uf-process") << "bind variable..." << std::endl;\r
int j = getVariableId(f, v);\r
- for (std::map<Node, EntryTrie>::iterator it = curr.d_child.begin(); it != curr.d_child.end(); ++it) {\r
- cond[j+1] = it->first;\r
- doUninterpretedCompose2(fm, f, entries, index+1, cond, val, it->second);\r
+ if( fm->isStar(cond[j+1]) ){\r
+ for (std::map<Node, EntryTrie>::iterator it = curr.d_child.begin(); it != curr.d_child.end(); ++it) {\r
+ cond[j+1] = it->first;\r
+ doUninterpretedCompose2(fm, f, entries, index+1, cond, val, it->second);\r
+ }\r
+ cond[j+1] = fm->getStar(v.getType());\r
+ }else{\r
+ Node orig = cond[j+1];\r
+ for (std::map<Node, EntryTrie>::iterator it = curr.d_child.begin(); it != curr.d_child.end(); ++it) {\r
+ Node nw = doIntervalMeet( fm, it->first, orig );\r
+ if( !nw.isNull() ){\r
+ cond[j+1] = nw;\r
+ doUninterpretedCompose2(fm, f, entries, index+1, cond, val, it->second);\r
+ }\r
+ }\r
+ cond[j+1] = orig;\r
}\r
- cond[j+1] = fm->getStar(v.getType());\r
}else{\r
if( !v.isNull() ){\r
if (curr.d_child.find(v)!=curr.d_child.end()) {\r
Trace("fmc-uf-process") << "follow value..." << std::endl;\r
doUninterpretedCompose2(fm, f, entries, index+1, cond, val, curr.d_child[v]);\r
}\r
- Node st = fm->getStar(v.getType());\r
+ Node st = fm->getStarElement(v.getType());\r
if (curr.d_child.find(st)!=curr.d_child.end()) {\r
Trace("fmc-uf-process") << "follow star..." << std::endl;\r
doUninterpretedCompose2(fm, f, entries, index+1, cond, val, curr.d_child[st]);\r
}\r
\r
int FullModelChecker::isCompat( FirstOrderModelFmc * fm, std::vector< Node > & cond, Node c ) {\r
+ Trace("fmc-debug2") << "isCompat " << c << std::endl;\r
Assert(cond.size()==c.getNumChildren()+1);\r
for (unsigned i=1; i<cond.size(); i++) {\r
- if( cond[i]!=c[i-1] && !fm->isStar(cond[i]) && !fm->isStar(c[i-1]) ) {\r
- return 0;\r
+ if( options::fmfFmcInterval() && cond[i].getType().isInteger() ){\r
+ Node iv = doIntervalMeet( fm, cond[i], c[i-1], false );\r
+ if( iv.isNull() ){\r
+ return 0;\r
+ }\r
+ }else{\r
+ if( cond[i]!=c[i-1] && !fm->isStar(cond[i]) && !fm->isStar(c[i-1]) ) {\r
+ return 0;\r
+ }\r
}\r
}\r
return 1;\r
}\r
\r
bool FullModelChecker::doMeet( FirstOrderModelFmc * fm, std::vector< Node > & cond, Node c ) {\r
+ Trace("fmc-debug2") << "doMeet " << c << std::endl;\r
Assert(cond.size()==c.getNumChildren()+1);\r
for (unsigned i=1; i<cond.size(); i++) {\r
if( cond[i]!=c[i-1] ) {\r
- if( fm->isStar(cond[i]) ){\r
- cond[i] = c[i-1];\r
- }else if( !fm->isStar(c[i-1]) ){\r
- return false;\r
+ if( options::fmfFmcInterval() && cond[i].getType().isInteger() ){\r
+ Node iv = doIntervalMeet( fm, cond[i], c[i-1] );\r
+ if( !iv.isNull() ){\r
+ cond[i] = iv;\r
+ }else{\r
+ return false;\r
+ }\r
+ }else{\r
+ if( fm->isStar(cond[i]) ){\r
+ cond[i] = c[i-1];\r
+ }else if( !fm->isStar(c[i-1]) ){\r
+ return false;\r
+ }\r
}\r
}\r
}\r
return true;\r
}\r
\r
+Node FullModelChecker::doIntervalMeet( FirstOrderModelFmc * fm, Node i1, Node i2, bool mk ) {\r
+ if( !fm->isInterval( i1 ) || !fm->isInterval( i2 ) ){\r
+ std::cout << "Not interval during meet! " << i1 << " " << i2 << std::endl;\r
+ exit( 0 );\r
+ }\r
+ Node b[2];\r
+ for( unsigned j=0; j<2; j++ ){\r
+ Node b1 = i1[j];\r
+ Node b2 = i2[j];\r
+ if( fm->isStar( b1 ) ){\r
+ b[j] = b2;\r
+ }else if( fm->isStar( b2 ) ){\r
+ b[j] = b1;\r
+ }else if( b1.getConst<Rational>() < b2.getConst<Rational>() ){\r
+ b[j] = j==0 ? b2 : b1;\r
+ }else{\r
+ b[j] = j==0 ? b1 : b2;\r
+ }\r
+ }\r
+ if( fm->isStar( b[0] ) || fm->isStar( b[1] ) || b[0].getConst<Rational>() < b[1].getConst<Rational>() ){\r
+ return mk ? fm->getInterval( b[0], b[1] ) : i1;\r
+ }else{\r
+ return Node::null();\r
+ }\r
+}\r
+\r
Node FullModelChecker::mkCond( std::vector< Node > & cond ) {\r
return NodeManager::currentNM()->mkNode(APPLY_UF, cond);\r
}\r
//get function symbol for f\r
cond.push_back(d_quant_cond[f]);\r
for (unsigned i=0; i<f[0].getNumChildren(); i++) {\r
- Node ts = fm->getStar( f[0][i].getType() );\r
+ Node ts = fm->getStarElement( f[0][i].getType() );\r
cond.push_back(ts);\r
}\r
}\r
std::map< Node, std::vector< int > > new_indices;\r
for( unsigned i=0; i<indices.size(); i++ ){\r
Node v = fm->d_models[op]->d_cond[indices[i]][index];\r
- new_indices[v].push_back( i );\r
+ new_indices[v].push_back( indices[i] );\r
}\r
\r
for( std::map< Node, std::vector< int > >::iterator it = new_indices.begin(); it != new_indices.end(); ++it ){\r
\r
void FullModelChecker::makeIntervalModel2( FirstOrderModelFmc * fm, Node op, std::vector< int > & indices, int index,\r
std::map< int, std::map< int, Node > >& changed_vals ) {\r
+ Debug("fmc-interval-model-debug") << "Process " << index << " with indicies : ";\r
+ for( unsigned i=0; i<indices.size(); i++ ){\r
+ Debug("fmc-interval-model-debug") << indices[i] << " ";\r
+ }\r
+ Debug("fmc-interval-model-debug") << std::endl;\r
+\r
if( index<(int)fm->d_models[op]->d_cond[0].getNumChildren() ){\r
TypeNode tn = fm->d_models[op]->d_cond[0][index].getType();\r
if( tn.isInteger() ){\r
std::map< Node, std::vector< int > > new_indices;\r
for( unsigned i=0; i<indices.size(); i++ ){\r
Node v = fm->d_models[op]->d_cond[indices[i]][index];\r
- new_indices[v].push_back( i );\r
+ new_indices[v].push_back( indices[i] );\r
+ if( !v.isConst() ){\r
+ Trace("fmc-warn") << "WARNING: for interval, model has non-constant : " << v << std::endl;\r
+ Trace("fmc-warn") << "From condition : " << fm->d_models[op]->d_cond[indices[i]] << std::endl;\r
+ }\r
}\r
\r
std::vector< Node > values;\r
for( std::map< Node, std::vector< int > >::iterator it = new_indices.begin(); it != new_indices.end(); ++it ){\r
makeIntervalModel2( fm, op, it->second, index+1, changed_vals );\r
- if( !fm->isStar(it->first) ){\r
- values.push_back( it->first );\r
- }\r
+ values.push_back( it->first );\r
}\r
\r
if( tn.isInteger() ){\r
}\r
Node interval = fm->getInterval( lb, ub );\r
for( unsigned j=0; j<new_indices[values[sindices[i]]].size(); j++ ){\r
+ Debug("fmc-interval-model-debug") << "Change " << new_indices[values[sindices[i]]][j] << ", " << index << " to " << interval << std::endl;\r
changed_vals[new_indices[values[sindices[i]]][j]][index] = interval;\r
}\r
ub = lb;\r