2class SymbolicFunction<RET(ARG)> :
public virtual Function<RET(ARG)> {
4 using DRetDArg =
typename Function<RET(ARG)>::DRetDArg;
5 using DRetDDir =
typename Function<RET(ARG)>::DRetDDir;
6 using DDRetDDArg =
typename Function<RET(ARG)>::DDRetDDArg;
7 using ArgS =
typename ReplaceAT<ARG, IndependentVariable>::Type;
8 using RetS =
typename ReplaceAT<RET, SymbolicExpression>::Type;
11 SymbolicFunction(
const ArgS &argS_,
const RetS &retS_);
12 void setIndependentVariable(
const ArgS &argS_);
13 void setDependentFunction(
const RetS &retS_);
14 ArgS& getIndependentVariable();
15 RetS& getDependentFunction();
18 std::pair<int, int> getRetSize()
const override;
19 int getArgSize()
const override;
21 RET operator()(
const ARG &arg)
override;
23 DRetDArg parDer(
const ARG &arg)
override;
25 DRetDDir dirDer(
const ARG &argDir,
const ARG &arg)
override;
27 DDRetDDArg parDerParDer(
const ARG &arg)
override;
30 DRetDArg parDerDirDer(
const ARG &argDir,
const ARG &arg)
override;
32 DRetDDir dirDerDirDer(
const ARG &argDir_1,
const ARG &argDir_2,
const ARG &arg)
override;
33 bool constParDer()
const override;
41 std::unique_ptr<Eval<
decltype(retS)>> retSEval;
43 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg, SymbolicExpression>::Type>> pdEval;
45 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir, SymbolicExpression>::Type>> ddEval;
47 std::unique_ptr<Eval<typename ReplaceAT<DDRetDDArg, SymbolicExpression>::Type>> pdpdEval;
50 std::unique_ptr<Eval<typename ReplaceAT<DRetDArg, SymbolicExpression>::Type>> pdddEval;
52 std::unique_ptr<Eval<typename ReplaceAT<DRetDDir, SymbolicExpression>::Type>> ddddEval;
53 bool isParDerConst =
false;
57SymbolicFunction<RET(ARG)>::SymbolicFunction() {
64SymbolicFunction<RET(ARG)>::SymbolicFunction(
const ArgS &argS_,
const RetS &retS_) : argS(argS_), retS(retS_) {
72void SymbolicFunction<RET(ARG)>::setIndependentVariable(
const ArgS &argS_) {
77void SymbolicFunction<RET(ARG)>::setDependentFunction(
const RetS &retS_) {
82typename SymbolicFunction<RET(ARG)>::ArgS& SymbolicFunction<RET(ARG)>::getIndependentVariable() {
87typename SymbolicFunction<RET(ARG)>::RetS& SymbolicFunction<RET(ARG)>::getDependentFunction() {
92void SymbolicFunction<RET(ARG)>::init() {
93 Helper<ArgS>::initIndep(argDirS, Helper<ArgS>::size1(argS));
94 Helper<ArgS>::initIndep(argDirS, Helper<ArgS>::size1(argS));
95 Helper<ArgS>::initIndep(argDirS_2, Helper<ArgS>::size1(argS));
96 retSEval.reset(
new Eval<
decltype(retS)>{retS});
98 pdEval.reset(
new Eval<
typename ReplaceAT<DRetDArg, SymbolicExpression>::Type>{
fmatvec::parDer(retS, argS)});
100 ddEval.reset(
new Eval<
typename ReplaceAT<DRetDDir, SymbolicExpression>::Type>{fmatvec::dirDer(retS, argDirS*1, argS)});
105 pdddEval.reset(
new Eval<
typename ReplaceAT<DRetDArg, SymbolicExpression>::Type>{fmatvec::dirDer(
fmatvec::parDer(retS, argS), argDirS*1, argS)});
107 ddddEval.reset(
new Eval<
typename ReplaceAT<DRetDDir, SymbolicExpression>::Type>{fmatvec::dirDer(fmatvec::dirDer(retS, argDirS*1, argS), argDirS_2*1, argS)});
111std::pair<int, int> SymbolicFunction<RET(ARG)>::getRetSize()
const {
112 return std::make_pair(Helper<RetS>::size1(retS), Helper<RetS>::size2(retS));
116int SymbolicFunction<RET(ARG)>::getArgSize()
const {
117 return Helper<ArgS>::size1(argS);
121RET SymbolicFunction<RET(ARG)>::operator()(
const ARG &arg) {
123 return (*retSEval)();
128auto SymbolicFunction<RET(ARG)>::parDer(
const ARG &arg) -> DRetDArg {
135auto SymbolicFunction<RET(ARG)>::dirDer(
const ARG &argDir,
const ARG &arg) -> DRetDDir {
143auto SymbolicFunction<RET(ARG)>::parDerParDer(
const ARG &arg) -> DDRetDDArg {
145 return (*pdpdEval)();
151auto SymbolicFunction<RET(ARG)>::parDerDirDer(
const ARG &argDir,
const ARG &arg) -> DRetDArg {
154 return (*pdddEval)();
159auto SymbolicFunction<RET(ARG)>::dirDerDirDer(
const ARG &argDir_1,
const ARG &argDir_2,
const ARG &arg) -> DRetDDir {
163 return (*ddddEval)();
167bool SymbolicFunction<RET(ARG)>::constParDer()
const {
168 return isParDerConst;
SymbolicExpression parDer(const SymbolicExpression &dep, const IndependentVariable &indep)
Definition: ast.cc:299