}
}
}
+ TypeNode v_tn = q.isNull() ? a.getType() : q[0][index].getType();
if (options::quantRepMode() == options::QuantRepMode::EE)
{
- return r;
+ int score = getRepScore(r, q, index, v_tn);
+ if (score >= 0)
+ {
+ return r;
+ }
+ // if we are not a valid representative, try to select one below
+ }
+ std::map<Node, Node>& v_int_rep = d_int_rep[v_tn];
+ std::map<Node, Node>::const_iterator itir = v_int_rep.find(r);
+ if (itir != v_int_rep.end())
+ {
+ return itir->second;
}
- else
+ // find best selection for representative
+ Node r_best;
+ std::vector<Node> eqc;
+ getEquivalenceClass(r, eqc);
+ Trace("internal-rep-select")
+ << "Choose representative for equivalence class : " << eqc
+ << ", type = " << v_tn << std::endl;
+ int r_best_score = -1;
+ for (const Node& n : eqc)
{
- TypeNode v_tn = q.isNull() ? a.getType() : q[0][index].getType();
- std::map<Node, Node>& v_int_rep = d_int_rep[v_tn];
- std::map<Node, Node>::const_iterator itir = v_int_rep.find(r);
- if (itir != v_int_rep.end())
+ int score = getRepScore(n, q, index, v_tn);
+ if (score != -2)
{
- return itir->second;
+ if (r_best.isNull()
+ || (score >= 0 && (r_best_score < 0 || score < r_best_score)))
+ {
+ r_best = n;
+ r_best_score = score;
+ }
}
- else
+ }
+ if (r_best.isNull())
+ {
+ Trace("internal-rep-warn")
+ << "No valid choice for representative in eqc class " << eqc
+ << std::endl;
+ return Node::null();
+ }
+ // now, make sure that no other member of the class is an instance
+ std::unordered_map<TNode, Node, TNodeHashFunction> cache;
+ r_best = getInstance(r_best, eqc, cache);
+ // store that this representative was chosen at this point
+ if (d_rep_score.find(r_best) == d_rep_score.end())
+ {
+ d_rep_score[r_best] = d_reset_count;
+ }
+ Trace("internal-rep-select")
+ << "...Choose " << r_best << " with score " << r_best_score
+ << " and type " << r_best.getType() << std::endl;
+ Assert(r_best.getType().isSubtypeOf(v_tn));
+ v_int_rep[r] = r_best;
+ if (Trace.isOn("internal-rep-debug"))
+ {
+ if (r_best != a)
{
- //find best selection for representative
- Node r_best;
- // if( options::fmfRelevantDomain() && !q.isNull() ){
- // Trace("internal-rep-debug") << "Consult relevant domain to mkRep " <<
- // r << std::endl;
- // r_best = d_qe->getRelevantDomain()->getRelevantTerm( q, index, r );
- // Trace("internal-rep-debug") << "Returned " << r_best << " " << r <<
- // std::endl;
- //}
- std::vector< Node > eqc;
- getEquivalenceClass( r, eqc );
- Trace("internal-rep-select") << "Choose representative for equivalence class : { ";
- for( unsigned i=0; i<eqc.size(); i++ ){
- if (i > 0)
- {
- Trace("internal-rep-select") << ", ";
- }
- Trace("internal-rep-select") << eqc[i];
- }
- Trace("internal-rep-select") << " }, type = " << v_tn << std::endl;
- int r_best_score = -1;
- for( size_t i=0; i<eqc.size(); i++ ){
- int score = getRepScore(eqc[i], q, index, v_tn);
- if( score!=-2 ){
- if( r_best.isNull() || ( score>=0 && ( r_best_score<0 || score<r_best_score ) ) ){
- r_best = eqc[i];
- r_best_score = score;
- }
- }
- }
- if( r_best.isNull() ){
- Trace("internal-rep-warn") << "No valid choice for representative in eqc class." << std::endl;
- r_best = r;
- }
- //now, make sure that no other member of the class is an instance
- std::unordered_map<TNode, Node, TNodeHashFunction> cache;
- r_best = getInstance( r_best, eqc, cache );
- //store that this representative was chosen at this point
- if( d_rep_score.find( r_best )==d_rep_score.end() ){
- d_rep_score[ r_best ] = d_reset_count;
- }
- Trace("internal-rep-select")
- << "...Choose " << r_best << " with score " << r_best_score
- << " and type " << r_best.getType() << std::endl;
- Assert(r_best.getType().isSubtypeOf(v_tn));
- v_int_rep[r] = r_best;
- if( r_best!=a ){
- Trace("internal-rep-debug") << "rep( " << a << " ) = " << r << ", " << std::endl;
- Trace("internal-rep-debug") << "int_rep( " << a << " ) = " << r_best << ", " << std::endl;
- }
- return r_best;
+ Trace("internal-rep-debug")
+ << "rep( " << a << " ) = " << r << ", " << std::endl;
+ Trace("internal-rep-debug")
+ << "int_rep( " << a << " ) = " << r_best << ", " << std::endl;
}
}
+ return r_best;
}
eq::EqualityEngine* EqualityQueryQuantifiersEngine::getEngine(){
bool usingModelEqualityEngine() const { return d_useModelEe; }
/** debug print equality engine */
void debugPrintEqualityEngine( const char * c );
- /** get internal representative */
+ /** get internal representative
+ *
+ * Choose a term that is equivalent to a in the current context that is the
+ * best term for instantiating the index^th variable of quantified formula q.
+ * If no legal term can be found, we return null. This can occur if:
+ * - a's type is not a subtype of the type of the index^th variable of q,
+ * - a is in an equivalent class with all terms that are restricted not to
+ * appear in instantiations of q, e.g. INST_CONSTANT terms for counterexample
+ * guided instantiation.
+ */
Node getInternalRepresentative( Node a, Node q, int index );
public: