SundanceBinaryEvaluator.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
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

Site Contact