00001 /*****************************************************************************/ 00002 /*! 00003 * \file decision_engine.h 00004 * 00005 * Author: Clark Barrett 00006 * 00007 * Created: Fri Jul 11 13:04:25 2003 00008 * 00009 * <hr> 00010 * 00011 * License to use, copy, modify, sell and/or distribute this software 00012 * and its documentation for any purpose is hereby granted without 00013 * royalty, subject to the terms and conditions defined in the \ref 00014 * LICENSE file provided with this distribution. 00015 * 00016 * <hr> 00017 * 00018 */ 00019 /*****************************************************************************/ 00020 00021 #ifndef _cvc3__search__decision_engine_h_ 00022 #define _cvc3__search__decision_engine_h_ 00023 00024 #include "statistics.h" 00025 #include "search_fast.h" 00026 00027 namespace CVC3 { 00028 00029 class DecisionEngine { 00030 00031 /***************************************************************************/ 00032 /*! 00033 *\defgroup DE Decision Engine 00034 *\brief Decision Engine, used by Search Engine 00035 *\ingroup SE 00036 *@{ 00037 */ 00038 /***************************************************************************/ 00039 00040 protected: 00041 TheoryCore* d_core; //!< Pointer to core theory 00042 SearchImplBase* d_se; //!< Pointer to search engine 00043 00044 //! List of currently active splitters 00045 CDList<Expr> d_splitters; 00046 00047 //! Total number of splitters 00048 StatCounter d_splitterCount; 00049 00050 ExprMap<Expr> d_bestByExpr; 00051 00052 //! Visited cache for findSplitterRec traversal. 00053 /*! Must be emptied in every findSplitter() call. */ 00054 ExprMap<Expr> d_visited; 00055 00056 Expr findSplitterRec(const Expr& e); 00057 virtual bool isBetter(const Expr& e1, const Expr& e2) = 0; 00058 00059 public: 00060 DecisionEngine(TheoryCore* core, SearchImplBase* se); 00061 virtual ~DecisionEngine() { } 00062 00063 /*! @brief Finds a splitter inside a non const expression. 00064 The expression passed in must not be a boolean constant, 00065 otherwise a DebugAssert will occur. \return Null Expr if passed 00066 in a Null Expr. */ 00067 virtual Expr findSplitter(const Expr& e) = 0; 00068 00069 //! Push context and record the splitter 00070 void pushDecision(Expr splitter, bool whichCase=true); 00071 //! Pop last decision (and context) 00072 void popDecision(); 00073 //! Pop to given scope 00074 void popTo(int dl); 00075 00076 //! Return the last known splitter. 00077 Expr lastSplitter(); 00078 00079 //! Search should call this when it derives 'false' 00080 virtual void goalSatisfied() = 0; 00081 00082 /*@}*/ // End of DE group 00083 00084 }; 00085 00086 } 00087 00088 #endif