Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef SUNDANCE_BINARYEVALUATOR_H
00043 #define SUNDANCE_BINARYEVALUATOR_H
00044
00045 #include "SundanceDefs.hpp"
00046 #include "SundanceSubtypeEvaluator.hpp"
00047 #include "SundanceEvaluatableExpr.hpp"
00048 #include "SundanceEvalManager.hpp"
00049
00050 namespace Sundance
00051 {
00052 class EvalContext;
00053
00054
00055
00056
00057
00058
00059 template <class ExprType> class BinaryEvaluator
00060 : public SubtypeEvaluator<ExprType>
00061 {
00062 public:
00063
00064 BinaryEvaluator(const ExprType* expr,
00065 const EvalContext& context)
00066 : SubtypeEvaluator<ExprType>(expr, context),
00067 leftExpr_(expr->leftEvaluatable()),
00068 rightExpr_(expr->rightEvaluatable()),
00069 leftSparsity_(leftExpr_->sparsitySuperset(context)),
00070 rightSparsity_(rightExpr_->sparsitySuperset(context)),
00071 leftEval_(leftExpr_->evaluator(context)),
00072 rightEval_(rightExpr_->evaluator(context))
00073 {
00074 Tabs tab;
00075 leftEval_->addClient();
00076 rightEval_->addClient();
00077 }
00078
00079
00080 virtual ~BinaryEvaluator(){;}
00081
00082
00083 virtual void resetNumCalls() const
00084 {
00085 leftEval_->resetNumCalls();
00086 rightEval_->resetNumCalls();
00087 Evaluator::resetNumCalls();
00088 }
00089
00090 protected:
00091
00092
00093 const RCP<SparsitySuperset>& leftSparsity() const
00094 {return leftSparsity_;}
00095
00096
00097 const RCP<SparsitySuperset>& rightSparsity() const
00098 {return rightSparsity_;}
00099
00100
00101 const EvaluatableExpr* leftExpr() const {return leftExpr_;}
00102
00103
00104 const EvaluatableExpr* rightExpr() const {return rightExpr_;}
00105
00106
00107 const RCP<Evaluator>& leftEval() const {return leftEval_;}
00108
00109
00110 const RCP<Evaluator>& rightEval() const {return rightEval_;}
00111
00112
00113 void evalChildren(const EvalManager& mgr,
00114 Array<double>& leftConstResults,
00115 Array<RCP<EvalVector> >& leftVecResults,
00116 Array<double>& rightConstResults,
00117 Array<RCP<EvalVector> >& rightVecResults) const
00118 {
00119 Tabs tabs;
00120 SUNDANCE_MSG2(mgr.verb(),
00121 tabs << "Evaluating left and right children: "
00122 << std::endl << tabs << "left=" << leftExpr_->toString()
00123 << std::endl << tabs << "right=" << rightExpr_->toString());
00124 SUNDANCE_MSG2(mgr.verb(),
00125 tabs << "Evaluating left=" << leftExpr_->toString());
00126 leftEval()->eval(mgr, leftConstResults, leftVecResults);
00127
00128 SUNDANCE_MSG2(mgr.verb(),
00129 tabs << "Evaluating right=" << rightExpr_->toString());
00130 rightEval()->eval(mgr, rightConstResults, rightVecResults);
00131 }
00132
00133 private:
00134 const EvaluatableExpr* leftExpr_;
00135
00136 const EvaluatableExpr* rightExpr_;
00137
00138 RCP<SparsitySuperset> leftSparsity_;
00139
00140 RCP<SparsitySuperset> rightSparsity_;
00141
00142 RCP<Evaluator> leftEval_;
00143
00144 RCP<Evaluator> rightEval_;
00145 };
00146 }
00147
00148
00149 #endif