11 const std::vector<std::shared_ptr<SymbolicExpr>>& functions,
12 const std::vector<std::string>&
vars,
16 context.limits().max_ast_nodes,
"jacobian");
17 const std::string operation =
"jacobian";
23 auto step =
context.consume_steps(functions.size() *
vars.size(), operation);
31 }
catch (
const std::bad_alloc&) {
33 "vector calculus allocation failed",
35 }
catch (
const std::length_error& error) {
37 }
catch (
const std::exception&
e) {
43 const std::vector<std::shared_ptr<SymbolicExpr>>& functions,
44 const std::vector<std::string>&
vars)
51 const std::vector<std::shared_ptr<SymbolicExpr>>& functions,
52 const std::vector<std::string>&
vars,
55 size_t m = functions.size();
56 size_t n =
vars.size();
57 std::size_t nodes = 1;
60 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid;
63 for (
size_t i = 0; i < m; ++i) {
64 std::vector<std::shared_ptr<SymbolicExpr>> row;
66 for (
size_t j = 0; j < n; ++j) {
71 row.push_back(partial);
73 grid.push_back(std::move(row));
76 return SymbolicExpr::matrix(grid);
81 const std::shared_ptr<SymbolicExpr>& f,
82 const std::vector<std::string>&
vars,
86 context.limits().max_ast_nodes,
"hessian");
87 const std::string operation =
"hessian";
92 auto step =
context.consume_steps(
vars.size() *
vars.size(), operation);
100 }
catch (
const std::bad_alloc&) {
102 "vector calculus allocation failed",
104 }
catch (
const std::length_error& error) {
106 }
catch (
const std::exception&
e) {
112 const std::shared_ptr<SymbolicExpr>& f,
113 const std::vector<std::string>&
vars)
120 const std::shared_ptr<SymbolicExpr>& f,
const std::vector<std::string>&
vars,
123 size_t n =
vars.size();
124 std::size_t nodes = 1;
127 std::vector<std::shared_ptr<SymbolicExpr>> first_partials;
128 first_partials.reserve(n);
129 for (
size_t i = 0; i < n; ++i) {
133 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(n,
134 std::vector<std::shared_ptr<SymbolicExpr>>(n));
136 for (
size_t i = 0; i < n; ++i) {
137 for (
size_t j = i; j < n; ++j) {
141 nodes = transform_budget.
append_size(nodes, partial_nodes);
142 if (i != j) nodes = transform_budget.
append_size(nodes, partial_nodes);
143 grid[i][j] = second_partial;
145 grid[j][i] = second_partial;
150 return SymbolicExpr::matrix(grid);
155 const std::vector<std::shared_ptr<SymbolicExpr>>& functions,
156 const std::vector<std::string>&
vars)
160 context.limits().max_ast_nodes,
"jacobian");
165 const std::shared_ptr<SymbolicExpr>& f,
const std::vector<std::string>&
vars)
169 context.limits().max_ast_nodes,
"hessian");
static Result failure(CasErrc code, std::string message, std::string operation={})
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
void require_nodes(std::size_t nodes) const
std::size_t append_size(std::size_t current, std::size_t child)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< void > vector_calculus_validate_expr_vars(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
std::shared_ptr< SymbolicExpr > jacobian_impl(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_functions_vars(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult vector_calculus_wrap_expr(std::shared_ptr< SymbolicExpr > expr, const std::string &operation)
std::shared_ptr< SymbolicExpr > hessian_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > hessian(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
std::shared_ptr< SymbolicExpr > jacobian(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars)
VectorCalculusExprResult hessian_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context)
VectorCalculusExprResult jacobian_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > VectorCalculusExprResult