2class SymbolicFunction<RET(ARG1, ARG2)> :
public virtual Function<RET(ARG1, ARG2)> {
4 using DRetDArg1 =
typename Function<RET(ARG1, ARG2)>::DRetDArg1;
5 using DRetDArg2 =
typename Function<RET(ARG1, ARG2)>::DRetDArg2;
6 using DRetDDir1 =
typename Function<RET(ARG1, ARG2)>::DRetDDir1;
7 using DRetDDir2 =
typename Function<RET(ARG1, ARG2)>::DRetDDir2;
8 using DDRetDDArg1 =
typename Function<RET(ARG1, ARG2)>::DDRetDDArg1;
9 using DDRetDDArg2 =
typename Function<RET(ARG1, ARG2)>::DDRetDDArg2;
10 using DDRetDArg1DArg2 =
typename Function<RET(ARG1, ARG2)>::DDRetDArg1DArg2;
11 using Arg1S =
typename ReplaceAT<ARG1, IndependentVariable>::Type;
12 using Arg2S =
typename ReplaceAT<ARG2, IndependentVariable>::Type;
13 using RetS =
typename ReplaceAT<RET, SymbolicExpression>::Type;
16 SymbolicFunction(
const Arg1S &arg1S_,
const Arg2S &arg2S_,
const RetS &retS_);
17 void setIndependentVariable1(
const Arg1S &arg1S_);
18 void setIndependentVariable2(
const Arg2S &arg2S_);
19 void setDependentFunction(
const RetS &retS_);
20 Arg1S& getIndependentVariable1();
21 Arg2S& getIndependentVariable2();
22 RetS& getDependentFunction();
25 std::pair<int, int> getRetSize()
const override;
26 int getArg1Size()
const override;
27 int getArg2Size()
const override;
29 RET operator()(
const ARG1 &arg1,
const ARG2 &arg2)
override;
31 DRetDArg1 parDer1(
const ARG1 &arg1,
const ARG2 &arg2)
override;
33 DRetDDir1 dirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
35 DRetDArg2 parDer2(
const ARG1 &arg1,
const ARG2 &arg2)
override;
37 DRetDDir2 dirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
39 DDRetDDArg1 parDer1ParDer1(
const ARG1 &arg1,
const ARG2 &arg2)
override;
42 DRetDArg1 parDer1DirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
44 DRetDDir1 dirDer1DirDer1(
const ARG1 &arg1Dir_1,
const ARG1 &arg1Dir_2,
const ARG1 &arg1,
const ARG2 &arg2)
override;
46 DDRetDDArg2 parDer2ParDer2(
const ARG1 &arg1,
const ARG2 &arg2)
override;
49 DRetDArg2 parDer2DirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
51 DRetDDir2 dirDer2DirDer2(
const ARG2 &arg2Dir_1,
const ARG2 &arg2Dir_2,
const ARG1 &arg1,
const ARG2 &arg2)
override;
53 DDRetDArg1DArg2 parDer1ParDer2(
const ARG1 &arg1,
const ARG2 &arg2)
override;
56 DRetDArg1 parDer1DirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
58 DRetDDir2 dirDer2DirDer1(
const ARG2 &arg2Dir,
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
60 DRetDArg2 parDer2DirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2)
override;
62 bool constParDer1()
const override;
63 bool constParDer2()
const override;
74 std::unique_ptr<Eval<
decltype(retS)>> retSEval;
76 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>> pd1Eval;
78 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir1, SymbolicExpression>::Type>> dd1Eval;
80 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>> pd2Eval;
82 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>> dd2Eval;
84 std::unique_ptr<Eval<typename ReplaceAT<DDRetDDArg1, SymbolicExpression>::Type>> pd1pd1Eval;
87 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>> pd1dd1Eval;
89 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir1, SymbolicExpression>::Type>> dd1dd1Eval;
91 std::unique_ptr<Eval<typename ReplaceAT<DDRetDDArg2, SymbolicExpression>::Type>> pd2pd2Eval;
94 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>> pd2dd2Eval;
96 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>> dd2dd2Eval;
98 std::unique_ptr<Eval<typename ReplaceAT<DDRetDArg1DArg2, SymbolicExpression>::Type>> pd1pd2Eval;
101 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>> pd1dd2Eval;
103 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>> dd2dd1Eval;
105 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>> pd2dd1Eval;
107 bool isParDer1Const =
false;
108 bool isParDer2Const =
false;
112SymbolicFunction<RET(ARG1, ARG2)>::SymbolicFunction() {
114 isParDer1Const=
false;
115 isParDer2Const=
false;
120SymbolicFunction<RET(ARG1, ARG2)>::SymbolicFunction(
const Arg1S &arg1S_,
const Arg2S &arg2S_,
const RetS &retS_) :
121 arg1S(arg1S_), arg2S(arg2S_), retS(retS_) {
123 isParDer1Const=
false;
124 isParDer2Const=
false;
130void SymbolicFunction<RET(ARG1, ARG2)>::setIndependentVariable1(
const Arg1S &arg1S_) {
135void SymbolicFunction<RET(ARG1, ARG2)>::setIndependentVariable2(
const Arg2S &arg2S_) {
140void SymbolicFunction<RET(ARG1, ARG2)>::setDependentFunction(
const RetS &retS_) {
145typename SymbolicFunction<RET(ARG1, ARG2)>::Arg1S& SymbolicFunction<RET(ARG1, ARG2)>::getIndependentVariable1() {
150typename SymbolicFunction<RET(ARG1, ARG2)>::Arg2S& SymbolicFunction<RET(ARG1, ARG2)>::getIndependentVariable2() {
155typename SymbolicFunction<RET(ARG1, ARG2)>::RetS& SymbolicFunction<RET(ARG1, ARG2)>::getDependentFunction() {
160void SymbolicFunction<RET(ARG1, ARG2)>::init() {
161 Helper<Arg1S>::initIndep(argDir1S, Helper<Arg1S>::size1(arg1S));
162 Helper<Arg1S>::initIndep(argDir1S, Helper<Arg1S>::size1(arg1S));
163 Helper<Arg1S>::initIndep(argDir1S_2, Helper<Arg1S>::size1(arg1S));
164 Helper<Arg2S>::initIndep(argDir2S, Helper<Arg2S>::size1(arg2S));
165 Helper<Arg2S>::initIndep(argDir2S, Helper<Arg2S>::size1(arg2S));
166 Helper<Arg2S>::initIndep(argDir2S_2, Helper<Arg2S>::size1(arg2S));
167 retSEval.reset(
new Eval<
decltype(retS)>{retS});
169 pd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>{
fmatvec::parDer(retS, arg1S)});
171 dd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDDir1, SymbolicExpression>::Type>{fmatvec::dirDer(retS, argDir1S*1, arg1S)});
173 pd2Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>{
fmatvec::parDer(retS, arg2S)});
175 dd2Eval.reset(
new Eval<
typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>{fmatvec::dirDer(retS, argDir2S*1, arg2S)});
180 pd1dd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>{fmatvec::dirDer(
fmatvec::parDer(retS, arg1S), argDir1S*1, arg1S)});
182 dd1dd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDDir1, SymbolicExpression>::Type>{fmatvec::dirDer(fmatvec::dirDer(retS, argDir1S*1, arg1S), argDir1S_2*1, arg1S)});
187 pd2dd2Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>{fmatvec::dirDer(
fmatvec::parDer(retS, arg2S), argDir2S*1, arg2S)});
189 dd2dd2Eval.reset(
new Eval<
typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>{fmatvec::dirDer(fmatvec::dirDer(retS, argDir2S*1, arg2S), argDir2S_2*1, arg2S)});
194 pd1dd2Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg1, SymbolicExpression>::Type>{fmatvec::dirDer(
fmatvec::parDer(retS, arg1S), argDir2S*1, arg2S)});
196 dd2dd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDDir2, SymbolicExpression>::Type>{fmatvec::dirDer(fmatvec::dirDer(retS, argDir2S*1, arg2S), argDir1S*1, arg1S)});
198 pd2dd1Eval.reset(
new Eval<
typename ReplaceAT<DRetDArg2, SymbolicExpression>::Type>{fmatvec::dirDer(
fmatvec::parDer(retS, arg2S), argDir1S*1, arg1S)});
203std::pair<int, int> SymbolicFunction<RET(ARG1, ARG2)>::getRetSize()
const {
204 return std::make_pair(Helper<RetS>::size1(retS), Helper<RetS>::size2(retS));
208int SymbolicFunction<RET(ARG1, ARG2)>::getArg1Size()
const {
209 return Helper<Arg1S>::size1(arg1S);
213int SymbolicFunction<RET(ARG1, ARG2)>::getArg2Size()
const {
214 return Helper<Arg2S>::size1(arg2S);
218RET SymbolicFunction<RET(ARG1, ARG2)>::operator()(
const ARG1 &arg1,
const ARG2 &arg2) {
221 return (*retSEval)();
226auto SymbolicFunction<RET(ARG1, ARG2)>::parDer1(
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg1 {
234auto SymbolicFunction<RET(ARG1, ARG2)>::dirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDDir1 {
243auto SymbolicFunction<RET(ARG1, ARG2)>::parDer2(
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg2 {
251auto SymbolicFunction<RET(ARG1, ARG2)>::dirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDDir2 {
260auto SymbolicFunction<RET(ARG1, ARG2)>::parDer1ParDer1(
const ARG1 &arg1,
const ARG2 &arg2) -> DDRetDDArg1 {
263 return (*pd1pd1Eval)();
269auto SymbolicFunction<RET(ARG1, ARG2)>::parDer1DirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg1 {
273 return (*pd1dd1Eval)();
278auto SymbolicFunction<RET(ARG1, ARG2)>::dirDer1DirDer1(
const ARG1 &arg1Dir_1,
const ARG1 &arg1Dir_2,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDDir1 {
280 argDir1S_2^=arg1Dir_2;
283 return (*dd1dd1Eval)();
288auto SymbolicFunction<RET(ARG1, ARG2)>::parDer2ParDer2(
const ARG1 &arg1,
const ARG2 &arg2) -> DDRetDDArg2 {
291 return (*pd2pd2Eval)();
297auto SymbolicFunction<RET(ARG1, ARG2)>::parDer2DirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg2 {
301 return (*pd2dd2Eval)();
306auto SymbolicFunction<RET(ARG1, ARG2)>::dirDer2DirDer2(
const ARG2 &arg2Dir_1,
const ARG2 &arg2Dir_2,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDDir2 {
308 argDir2S_2^=arg2Dir_2;
311 return (*dd2dd2Eval)();
316auto SymbolicFunction<RET(ARG1, ARG2)>::parDer1ParDer2(
const ARG1 &arg1,
const ARG2 &arg2) -> DDRetDArg1DArg2 {
319 return (*pd1pd2Eval)();
325auto SymbolicFunction<RET(ARG1, ARG2)>::parDer1DirDer2(
const ARG2 &arg2Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg1 {
329 return (*pd1dd2Eval)();
334auto SymbolicFunction<RET(ARG1, ARG2)>::dirDer2DirDer1(
const ARG2 &arg2Dir,
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDDir2 {
339 return (*dd2dd1Eval)();
344auto SymbolicFunction<RET(ARG1, ARG2)>::parDer2DirDer1(
const ARG1 &arg1Dir,
const ARG1 &arg1,
const ARG2 &arg2) -> DRetDArg2 {
348 return (*pd2dd1Eval)();
353bool SymbolicFunction<RET(ARG1, ARG2)>::constParDer1()
const {
354 return isParDer1Const;
358bool SymbolicFunction<RET(ARG1, ARG2)>::constParDer2()
const {
359 return isParDer2Const;
SymbolicExpression parDer(const SymbolicExpression &dep, const IndependentVariable &indep)
Definition: ast.cc:299