00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "decision_engine.h"
00024 #include "theory_core.h"
00025 #include "search.h"
00026
00027
00028 using namespace std;
00029 using namespace CVC3;
00030
00031
00032 DecisionEngine::DecisionEngine(TheoryCore* core, SearchImplBase* se)
00033 : d_core(core), d_se(se),
00034 d_splitters(core->getCM()->getCurrentContext()),
00035 d_splitterCount(core->getStatistics().counter("splitters"))
00036 {
00037 IF_DEBUG(d_splitters.setName("CDList[SearchEngineDefault.d_splitters]");)
00038 }
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 Expr DecisionEngine::findSplitterRec(const Expr& e)
00056 {
00057 Expr best;
00058
00059 if(d_visited.count(e) > 0)
00060 return d_visited[e];
00061
00062 if (e.isTrue() || e.isFalse() || e.isAtomic()
00063 || !d_se->isGoodSplitter(e)) {
00064 d_visited[e] = best;
00065 return best;
00066 }
00067
00068 if (e.isAbsAtomicFormula()) {
00069 d_visited[e] = e;
00070 return e;
00071 }
00072
00073 ExprMap<Expr>::iterator it = d_bestByExpr.find(e);
00074 if (it != d_bestByExpr.end()) {
00075 d_visited[e] = it->second;
00076 return it->second;
00077 }
00078
00079 vector<int> order(e.arity());
00080 int i = 0;
00081
00082 if (e.isITE())
00083 {
00084 order[i++] = 0;
00085 order[i++] = 1;
00086 order[i++] = 2;
00087 }
00088
00089 else
00090 {
00091 if (e.arity() > 0)
00092 {
00093 order[i++] = 0;
00094 for (int k = 0; k < e.arity(); ++k)
00095 if (k != 0)
00096 order[i++] = k;
00097 }
00098 }
00099
00100 for (int k = 0; k < e.arity(); k++)
00101 {
00102 Expr splitter =
00103 findSplitterRec(d_core->findExpr(e[order[k]]));
00104 if (!splitter.isNull() && (best.isNull() || isBetter(splitter, best)))
00105 best = splitter;
00106 }
00107
00108 d_bestByExpr[e] = best;
00109 d_visited[e] = best;
00110 return best;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 void DecisionEngine::pushDecision(Expr splitter, bool whichCase)
00129 {
00130 string stCase = whichCase ? "TRUE" : "FALSE";
00131 if (whichCase) d_splitterCount++;
00132 d_core->getCM()->push();
00133 TRACE("search trace", "Asserting splitter("+stCase+"): ", splitter, "");
00134 TRACE("search", "Asserting splitter("+stCase+"): ", splitter, "");
00135 d_splitters.push_back(splitter);
00136 if (!whichCase)
00137 splitter = splitter.negate();
00138 Theorem thm = d_se->newIntAssumption(splitter);
00139 d_core->addFact(thm);
00140
00141
00142
00143
00144
00145 if(thm.getExpr().isAbsLiteral())
00146 d_se->addLiteralFact(thm);
00147 }
00148
00149
00150 void DecisionEngine::popDecision()
00151 {
00152 d_core->getCM()->pop();
00153 TRACE("search trace", "Pop: scope level =", d_core->getCM()->scopeLevel(), "");
00154 }
00155
00156
00157 void DecisionEngine::popTo(int dl)
00158 {
00159 d_core->getCM()->popto(dl);
00160 TRACE("search trace", "Popto: scope level =", d_core->getCM()->scopeLevel(), "");
00161 }
00162
00163
00164 Expr DecisionEngine::lastSplitter()
00165 {
00166 return d_splitters.back();
00167 }