22 using ValuesMap = std::map<ExprID,std::shared_ptr<AnalyticTypeBase>>;
25 class AnalyticExpr :
public ExprBase
29 AnalyticExpr<T>& operator=(
const AnalyticExpr<T>& x) =
delete;
31 virtual T fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const = 0;
32 virtual void bwd_eval(ValuesMap& v)
const = 0;
34 T init_value(ValuesMap& v,
const T& x)
const
36 auto it = v.find(unique_id());
40 v[unique_id()] = std::make_shared<T>(x);
44 *std::dynamic_pointer_cast<T>(it->second) = x;
45 return *std::dynamic_pointer_cast<T>(it->second);
48 T& value(ValuesMap& v)
const
50 assert(v.find(unique_id()) != v.end() &&
"argument cannot be found");
51 return *std::dynamic_pointer_cast<T>(v[unique_id()]);
54 virtual bool belongs_to_args_list(
const FunctionArgsList& args)
const = 0;
57 template<
typename C,
typename Y,
typename... X>
58 class AnalyticOperationExpr :
public AnalyticExpr<Y>,
public OperationExprBase<AnalyticExpr<X>...>
62 AnalyticOperationExpr(std::shared_ptr<AnalyticExpr<X>>... x)
63 : OperationExprBase<AnalyticExpr<X>...>(x...)
66 AnalyticOperationExpr(
const AnalyticOperationExpr<C,Y,X...>& e)
67 : OperationExprBase<AnalyticExpr<X>...>(e)
70 std::shared_ptr<ExprBase> copy()
const
72 return std::make_shared<AnalyticOperationExpr<C,Y,X...>>(*this);
75 void replace_expr(
const ExprID& old_expr_id,
const std::shared_ptr<ExprBase>& new_expr)
77 return OperationExprBase<AnalyticExpr<X>...>::replace_expr(old_expr_id, new_expr);
80 Y fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const
83 [
this,&v,total_input_size,natural_eval](
auto &&... x)
86 return AnalyticExpr<Y>::init_value(v, C::fwd_natural(x->fwd_eval(v, total_input_size, natural_eval)...));
89 return AnalyticExpr<Y>::init_value(v, C::fwd_centered(x->fwd_eval(v, total_input_size, natural_eval)...));
94 void bwd_eval(ValuesMap& v)
const
96 auto y = AnalyticExpr<Y>::value(v);
98 std::apply([&v,y](
auto &&... x)
100 C::bwd(y.a, x->value(v).a...);
103 std::apply([&v](
auto &&... x)
105 (x->bwd_eval(v), ...);
109 virtual bool belongs_to_args_list(
const FunctionArgsList& args)
const
113 std::apply([&b,args](
auto &&... x)
115 ((b &= x->belongs_to_args_list(args)), ...);