13#include <unordered_map>
40 std::type_index
type =
typeid(ScalarType);
172 std::unordered_map<Index,FlatInputBinding> _bindings;
177 static std::shared_ptr<ExprBase> as_expr_base(
const AnalyticExprWrapper<T>& e)
179 return std::static_pointer_cast<ExprBase>(
180 std::shared_ptr<AnalyticExpr<T>>(e)
185 requires std::is_base_of_v<AnalyticTypeBase,T>
186 class AnalyticFunction;
189 inline AnalyticFunction<T> unaryize_function(
const AnalyticFunction<T>& f)
191 if(f.nb_args() == 0 || (f.nb_args() == 1 && std::dynamic_pointer_cast<VectorVar>(f.args()[0])))
194 FlatInputLayout layout(f.args());
195 VectorVar flat_x(layout.size(),
"x");
197 auto y = std::dynamic_pointer_cast<AnalyticExpr<T>>(f.expr()->copy());
198 assert(y &&
"unaryize_function: unable to copy analytic expression");
200 for(
const auto& arg : f.args())
202 const auto& b = layout.binding_of(arg->unique_id());
204 if(std::dynamic_pointer_cast<ScalarVar>(arg))
205 y->replace_arg(arg->unique_id(), as_expr_base(flat_x[b.offset]));
207 else if(std::dynamic_pointer_cast<VectorVar>(arg))
209 assert(b.cols == 1 &&
"unaryize_function: invalid flat binding for vector input");
212 as_expr_base(flat_x.subvector(b.offset, b.offset + b.rows - 1))
218 assert(
false &&
"unaryize_function: only scalar/vector input arguments are currently supported");
222 return AnalyticFunction<T>({flat_x}, y);
A class representing a unique identifier for expressions.
Definition codac2_ExprBase.h:34
A container class to manage a collection of function arguments.
Definition codac2_FunctionArgsList.h:25
Definition codac2_OctaSym.h:21