/*****************************************************************************/ /*! * \file decision_engine.h * * Author: Clark Barrett * * Created: Fri Jul 11 13:04:25 2003 * *
* * License to use, copy, modify, sell and/or distribute this software * and its documentation for any purpose is hereby granted without * royalty, subject to the terms and conditions defined in the \ref * LICENSE file provided with this distribution. * *
* */ /*****************************************************************************/ #ifndef _cvc3__search__decision_engine_h_ #define _cvc3__search__decision_engine_h_ #include "statistics.h" #include "search_fast.h" namespace CVC3 { class DecisionEngine { /***************************************************************************/ /*! *\defgroup DE Decision Engine *\brief Decision Engine, used by Search Engine *\ingroup SE *@{ */ /***************************************************************************/ protected: TheoryCore* d_core; //!< Pointer to core theory SearchImplBase* d_se; //!< Pointer to search engine //! List of currently active splitters CDList d_splitters; //! Total number of splitters StatCounter d_splitterCount; ExprMap d_bestByExpr; //! Visited cache for findSplitterRec traversal. /*! Must be emptied in every findSplitter() call. */ ExprMap d_visited; Expr findSplitterRec(const Expr& e); virtual bool isBetter(const Expr& e1, const Expr& e2) = 0; public: DecisionEngine(TheoryCore* core, SearchImplBase* se); virtual ~DecisionEngine() { } /*! @brief Finds a splitter inside a non const expression. The expression passed in must not be a boolean constant, otherwise a DebugAssert will occur. \return Null Expr if passed in a Null Expr. */ virtual Expr findSplitter(const Expr& e) = 0; //! Push context and record the splitter void pushDecision(Expr splitter, bool whichCase=true); //! Pop last decision (and context) void popDecision(); //! Pop to given scope void popTo(int dl); //! Return the last known splitter. Expr lastSplitter(); //! Search should call this when it derives 'false' virtual void goalSatisfied() = 0; /*@}*/ // End of DE group }; } #endif