LAMA
|
00001 00034 #ifndef LAMA_CRITERIACREATOR_HPP_ 00035 #define LAMA_CRITERIACREATOR_HPP_ 00036 00037 // for dll_import 00038 #include <lama/config.hpp> 00039 00040 // others 00041 #include <lama/LAMATypes.hpp> 00042 00043 #include <boost/config/warning_disable.hpp> 00044 #include <boost/spirit/include/qi.hpp> 00045 #include <boost/spirit/include/phoenix_core.hpp> 00046 #include <boost/spirit/include/phoenix_operator.hpp> 00047 #include <boost/spirit/include/phoenix_fusion.hpp> 00048 #include <boost/spirit/include/phoenix_stl.hpp> 00049 #include <boost/spirit/home/phoenix/bind/bind_member_function.hpp> 00050 #include <boost/fusion/include/adapt_struct.hpp> 00051 #include <boost/variant/recursive_variant.hpp> 00052 00053 #include <lama/solver/creator/Creator.hpp> 00054 00055 //Norm 00056 #include <lama/norm/L1Norm.hpp> 00057 #include <lama/norm/L2Norm.hpp> 00058 #include <lama/norm/MaxNorm.hpp> 00059 00060 //Stopping Criteria 00061 #include <lama/solver/criteria/IterationCount.hpp> 00062 #include <lama/solver/criteria/ResidualThreshold.hpp> 00063 #include <lama/solver/criteria/ResidualStagnation.hpp> 00064 00065 // logging 00066 #include <logging/logging.hpp> 00067 00068 #include <ostream> 00069 00070 namespace lama 00071 { 00072 00073 namespace qi = boost::spirit::qi; 00074 namespace ascii = boost::spirit::ascii; 00075 namespace phoenix = boost::phoenix; 00076 00077 class LAMA_DLL_IMPORTEXPORT CriteriaCreator : Creator 00078 { 00079 public: 00080 typedef qi::rule<std::string::const_iterator, CriterionPtr(), ascii::space_type> RuleType; 00081 typedef qi::symbols<char, CriterionPtr > CriteriaInstanceMap; 00082 00086 static CriteriaCreator& getInstance(); 00087 00088 /* 00089 * @brief Returns the grammar rule for "in place" criteria creation 00090 * This is used by the IterativeSolverCreator class 00091 * In case of i.e. criteria = IterationCount(10) AND Resi... 00092 * the parameter definition of a criteria is solver bound and not reusable (registered) for 00093 * other solver instances. 00094 * 00095 * @return A rule that returns a BooleanContionPtr to the root of the criteria tree 00096 */ 00097 static RuleType& getSolverBoundRule(); 00098 00099 /* 00100 * @brief Returns the grammar rule for independent and registered criteria creation 00101 * This is used by the MetaSolver class 00102 * In case of i.e. Criterion criteria1 = IterationCount(10) AND Resi... 00103 * the parameter definition of a criteria is independent and reusable (registered) so that 00104 * other solver instances can use this instance multiple times. 00105 * 00106 * @return A rule that returns a BooleanContionPtr to the root of the criteria tree 00107 */ 00108 static qi::rule<std::string::const_iterator, void(), ascii::space_type>& getIndependentRule(); 00109 00115 const CriteriaInstanceMap& getCriteriaInstanceMap(); 00116 00117 protected: 00118 LAMA_LOG_DECL_STATIC_LOGGER(logger); 00119 00120 private: 00121 CriteriaCreator(); 00122 00129 void addCriteria( const std::string& name, CriterionPtr criteria ); 00130 00131 RuleType mRLeaf; 00132 RuleType mRNode; 00133 RuleType mRSolverBoundCriteria; 00134 qi::rule<std::string::const_iterator, void(), ascii::space_type> mRIndependentCriteria; 00135 qi::rule<std::string::const_iterator, IterationCount*(), ascii::space_type> mRIterationCount; 00136 qi::rule<std::string::const_iterator, ResidualThreshold*(), ascii::space_type> mRResidualThreshold; 00137 qi::rule<std::string::const_iterator, ResidualStagnation*(), ascii::space_type> mRResidualStagnation; 00138 qi::rule<std::string::const_iterator, NormPtr(), ascii::space_type> mRNormType; 00139 00140 CriteriaInstanceMap mCriteriaInstanceMap; 00141 00142 qi::symbols<char, ResidualThreshold::ResidualThresholdCheckMode> mResidualCheckMode; 00143 qi::symbols<char, Criterion::BooleanOperator> mLogicalConnective; 00144 }; 00145 00146 } // namespace lama 00147 00148 #endif // LAMA_CRITERIACREATOR_HPP_