LAMA
/home/brandes/workspace/LAMA/src/lama/solver/creator/CriteriaCreator.hpp
Go to the documentation of this file.
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_