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 #ifndef SUNDANCE_BINARYEVALUATOR_H
00032 #define SUNDANCE_BINARYEVALUATOR_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceSubtypeEvaluator.hpp"
00036 #include "SundanceEvaluatableExpr.hpp"
00037 #include "SundanceEvalManager.hpp"
00038 
00039 namespace Sundance 
00040 {
00041 class EvalContext;
00042   
00043 
00044 
00045 
00046 
00047 
00048 template <class ExprType> class BinaryEvaluator 
00049   : public SubtypeEvaluator<ExprType>
00050 {
00051 public:
00052 
00053   BinaryEvaluator(const ExprType* expr,
00054     const EvalContext& context)
00055     : SubtypeEvaluator<ExprType>(expr, context),
00056       leftExpr_(expr->leftEvaluatable()),
00057       rightExpr_(expr->rightEvaluatable()),
00058       leftSparsity_(leftExpr_->sparsitySuperset(context)),
00059       rightSparsity_(rightExpr_->sparsitySuperset(context)),
00060       leftEval_(leftExpr_->evaluator(context)),
00061       rightEval_(rightExpr_->evaluator(context))
00062     {
00063       Tabs tab;
00064       leftEval_->addClient();
00065       rightEval_->addClient();
00066     }
00067 
00068 
00069   virtual ~BinaryEvaluator(){;}
00070 
00071 
00072   virtual void resetNumCalls() const 
00073     {
00074       leftEval_->resetNumCalls();
00075       rightEval_->resetNumCalls();
00076       Evaluator::resetNumCalls();
00077     }
00078 
00079 protected:
00080       
00081 
00082   const RCP<SparsitySuperset>& leftSparsity() const 
00083     {return leftSparsity_;}
00084       
00085 
00086   const RCP<SparsitySuperset>& rightSparsity() const 
00087     {return rightSparsity_;}
00088 
00089 
00090   const EvaluatableExpr* leftExpr() const {return leftExpr_;}
00091 
00092 
00093   const EvaluatableExpr* rightExpr() const {return rightExpr_;}
00094 
00095 
00096   const RCP<Evaluator>& leftEval() const {return leftEval_;}
00097 
00098 
00099   const RCP<Evaluator>& rightEval() const {return rightEval_;}
00100 
00101 
00102   void evalChildren(const EvalManager& mgr,
00103     Array<double>& leftConstResults,
00104     Array<RCP<EvalVector> >& leftVecResults,
00105     Array<double>& rightConstResults,
00106     Array<RCP<EvalVector> >& rightVecResults) const 
00107     {
00108       Tabs tabs;
00109       SUNDANCE_MSG2(mgr.verb(), 
00110         tabs << "Evaluating left and right children: "
00111         << std::endl << tabs << "left=" << leftExpr_->toString()
00112         << std::endl << tabs << "right=" << rightExpr_->toString());
00113       SUNDANCE_MSG2(mgr.verb(),
00114         tabs << "Evaluating left=" << leftExpr_->toString());
00115       leftEval()->eval(mgr, leftConstResults, leftVecResults);
00116         
00117       SUNDANCE_MSG2(mgr.verb(),
00118         tabs << "Evaluating right=" << rightExpr_->toString());
00119       rightEval()->eval(mgr, rightConstResults, rightVecResults);
00120     }
00121 
00122 private:
00123   const EvaluatableExpr* leftExpr_;
00124 
00125   const EvaluatableExpr* rightExpr_;
00126 
00127   RCP<SparsitySuperset> leftSparsity_;
00128 
00129   RCP<SparsitySuperset> rightSparsity_;
00130 
00131   RCP<Evaluator> leftEval_;
00132 
00133   RCP<Evaluator> rightEval_;
00134 };
00135 }
00136 
00137 
00138 #endif