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_EXPRWITHCHILDREN_H
00032 #define SUNDANCE_EXPRWITHCHILDREN_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceEvaluatableExpr.hpp"
00036 #include "SundanceCombinatorialUtils.hpp"
00037 #include "SundanceScalarExpr.hpp"
00038 #include "SundanceExpr.hpp"
00039
00040 namespace Sundance
00041 {
00042 using namespace Sundance;
00043 using namespace Teuchos;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 class ExprWithChildren : public virtual EvaluatableExpr
00054 {
00055 public:
00056
00057 ExprWithChildren(const Array<RCP<ScalarExpr> >& children);
00058
00059
00060 virtual ~ExprWithChildren() {;}
00061
00062
00063
00064
00065 virtual void setupEval(const EvalContext& context) const ;
00066
00067
00068
00069 virtual bool isConstant() const ;
00070
00071
00072 int numChildren() const {return children_.size();}
00073
00074
00075 const EvaluatableExpr* evaluatableChild(int i) const ;
00076
00077
00078 const ScalarExpr* scalarChild(int i) const
00079 {return children_[i].get();}
00080
00081
00082 Expr child(int i) const {return Expr::handle(children_[i]);}
00083
00084
00085
00086
00087
00088
00089 virtual int maxDiffOrderOnDiscreteFunctions() const ;
00090
00091
00092
00093
00094 virtual bool hasDiscreteFunctions() const ;
00095
00096
00097 virtual Set<MultipleDeriv>
00098 internalFindW(int order, const EvalContext& context) const ;
00099
00100
00101 virtual Set<MultipleDeriv>
00102 internalFindC(int order, const EvalContext& context) const ;
00103
00104
00105 virtual Set<MultipleDeriv>
00106 internalFindV(int order, const EvalContext& context) const ;
00107
00108
00109 virtual void displayNonzeros(std::ostream& os,
00110 const EvalContext& context) const ;
00111
00112
00113 const Set<MultiSet<int> >& findQ_W(int order,
00114 const EvalContext& context) const ;
00115
00116
00117 const Set<MultiSet<int> >& findQ_C(int order,
00118 const EvalContext& context) const ;
00119
00120
00121 const Set<MultiSet<int> >& findQ_V(int order,
00122 const EvalContext& context) const ;
00123
00124
00125 virtual Set<MultiSet<int> >
00126 internalFindQ_W(int order,
00127 const EvalContext& context) const ;
00128
00129
00130 virtual Set<MultiSet<int> >
00131 internalFindQ_V(int order,
00132 const EvalContext& context) const ;
00133
00134
00135 virtual Set<MultiSet<int> >
00136 internalFindQ_C(int order,
00137 const EvalContext& context) const ;
00138
00139
00140 const Set<MultiSet<int> >& getI_N() const ;
00141
00142
00143 Set<MultiSet<int> > indexSetProduct(const Set<MultiSet<int> >& a,
00144 const Set<MultiSet<int> >& b) const ;
00145
00146
00147
00148 virtual bool everyTermHasTestFunctions() const ;
00149
00150
00151
00152 virtual bool hasTestFunctions() const ;
00153
00154
00155
00156 virtual bool hasUnkFunctions() const ;
00157
00158
00159 virtual void showSparsity(std::ostream& os,
00160 const EvalContext& context) const ;
00161
00162
00163 virtual void getUnknowns(Set<int>& unkID, Array<Expr>& unks) const ;
00164
00165
00166 virtual void getTests(Set<int>& varID, Array<Expr>& vars) const ;
00167
00168
00169
00170 virtual int countNodes() const ;
00171
00172
00173 virtual bool isLinear() const {return false;}
00174
00175
00176 virtual bool isProduct() const {return false;}
00177
00178
00179
00180 virtual bool isIndependentOf(const Expr& u) const ;
00181
00182
00183
00184 Set<MultiSet<int> > subsetContainingIndex(const Set<MultiSet<int> >& s,
00185 int index) const ;
00186
00187
00188 virtual RCP<Array<Set<MultipleDeriv> > >
00189 internalDetermineR(const EvalContext& context,
00190 const Array<Set<MultipleDeriv> >& RInput) const ;
00191
00192
00193
00194 bool childIsRequired(int childIndex, int diffOrder,
00195 const EvalContext& context) const ;
00196
00197
00198
00199
00200 Set<MultipleDeriv> product(const Array<int>& J, const Array<int>& K,
00201 DerivSubsetSpecifier dss,
00202 const EvalContext& context) const ;
00203
00204
00205 virtual void accumulateFuncSet(Set<int>& funcIDs,
00206 const Set<int>& activeSet) const ;
00207
00208
00209 virtual void registerSpatialDerivs(const EvalContext& context,
00210 const Set<MultiIndex>& miSet) const ;
00211
00212
00213 virtual bool lessThan(const ScalarExpr* other) const ;
00214
00215 private:
00216 Array<RCP<ScalarExpr> > children_;
00217
00218 static Map<int, Set<MultiSet<int> > >& cachedI_N()
00219 {static Map<int, Set<MultiSet<int> > > rtn; return rtn;}
00220
00221 mutable Array<Map<EvalContext, Set<MultiSet<int> > > > contextToQWMap_;
00222 mutable Array<Map<EvalContext, Set<MultiSet<int> > > > contextToQVMap_;
00223 mutable Array<Map<EvalContext, Set<MultiSet<int> > > > contextToQCMap_;
00224 };
00225
00226
00227
00228
00229 Array<Array<std::pair<int, Array<MultipleDeriv> > > > chainRuleDerivsOfArgs(int nArgs,
00230 const MultiSet<int>& bSet,
00231 const MultipleDeriv& c);
00232
00233
00234 Array<Array<Array<int> > > bStructure(const Array<int>& b,
00235 const Array<Array<int> >& tmp);
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 Array<OrderedPair<Array<MultiSet<int> >, Array<MultipleDeriv> > >
00246 chainRuleTerms(int s,
00247 const MultiSet<int>& lambda,
00248 const MultipleDeriv& nu) ;
00249
00250
00251
00252 Set<MultipleDeriv> multisetSubsets(const MultipleDeriv& x);
00253
00254
00255 int chainRuleMultiplicity(const MultipleDeriv& nu,
00256 const Array<MultiSet<int> >& K,
00257 const Array<MultipleDeriv>& L);
00258 }
00259
00260 #endif