20 const std::shared_ptr<SymbolicExpr>& expr,
24 if (!expr)
return false;
26 if (!numeric)
return false;
33 const std::shared_ptr<SymbolicExpr>& f,
34 const std::vector<std::string>&
vars,
36 const std::string& operation)
38 auto step =
context.consume_steps(1, operation);
39 if (!step)
return step;
42 "expression cannot be null", operation);
46 "variable list cannot be empty", operation);
48 for (
const auto& var :
vars) {
51 "variable name cannot be empty",
60 const std::vector<std::string>&
vars,
62 const std::string& operation)
64 auto step =
context.consume_steps(1, operation);
65 if (!step)
return step;
68 "vector field cannot be empty", operation);
70 if (field.size() !=
vars.size()) {
72 "vector field and variables must have the same dimension",
75 for (
const auto& var :
vars) {
78 "variable name cannot be empty",
82 for (
const auto& component : field) {
85 "vector field components cannot be null",
93 const std::vector<std::shared_ptr<SymbolicExpr>>& functions,
94 const std::vector<std::string>&
vars,
96 const std::string& operation)
98 auto step =
context.consume_steps(1, operation);
99 if (!step)
return step;
100 if (functions.empty()) {
102 "function list cannot be empty",
107 "variable list cannot be empty",
110 for (
const auto& var :
vars) {
113 "variable name cannot be empty",
117 for (
const auto&
function : functions) {
120 "function expressions cannot be null",
129 const std::string&
t,
130 const std::shared_ptr<SymbolicExpr>&
a,
131 const std::shared_ptr<SymbolicExpr>&
b,
133 const std::string& operation)
135 auto step =
context.consume_steps(1, operation);
136 if (!step)
return step;
139 "curve parametrization must be two- or three-dimensional",
144 "parameter variable name cannot be empty",
149 "curve integral bounds cannot be null",
155 "curve parametrization components cannot be null",
163 const std::shared_ptr<SymbolicExpr>& f,
165 const std::string&
t,
166 const std::shared_ptr<SymbolicExpr>&
a,
167 const std::shared_ptr<SymbolicExpr>&
b,
169 const std::string& operation)
171 auto step =
context.consume_steps(1, operation);
172 if (!step)
return step;
175 "scalar field cannot be null",
185 const std::string&
t,
186 const std::shared_ptr<SymbolicExpr>&
a,
187 const std::shared_ptr<SymbolicExpr>&
b,
189 const std::string& operation)
191 auto step =
context.consume_steps(1, operation);
192 if (!step)
return step;
195 "vector field cannot be empty",
200 "vector field and parametrization must have the same dimension",
203 for (
const auto& component : F) {
206 "vector field components cannot be null",
215 const std::shared_ptr<SymbolicExpr>&
u_lower,
216 const std::shared_ptr<SymbolicExpr>&
u_upper,
217 const std::shared_ptr<SymbolicExpr>&
v_lower,
218 const std::shared_ptr<SymbolicExpr>&
v_upper,
219 const std::string& operation)
224 "surface integral bounds cannot be null",
233 const std::string&
u,
234 const std::string&
v,
235 const std::shared_ptr<SymbolicExpr>&
u_lower,
236 const std::shared_ptr<SymbolicExpr>&
u_upper,
237 const std::shared_ptr<SymbolicExpr>&
v_lower,
238 const std::shared_ptr<SymbolicExpr>&
v_upper,
240 const std::string& operation)
242 auto step =
context.consume_steps(1, operation);
248 "surface parametrization must be three-dimensional",
251 if (
u.empty() ||
v.empty()) {
253 "surface parameter variable names cannot be empty",
258 "surface parameter variables must be distinct",
269 "surface parametrization components cannot be null",
277 const std::shared_ptr<SymbolicExpr>& f,
279 const std::string&
u,
280 const std::string&
v,
281 const std::shared_ptr<SymbolicExpr>&
u_lower,
282 const std::shared_ptr<SymbolicExpr>&
u_upper,
283 const std::shared_ptr<SymbolicExpr>&
v_lower,
284 const std::shared_ptr<SymbolicExpr>&
v_upper,
286 const std::string& operation)
288 auto step =
context.consume_steps(1, operation);
289 if (!step)
return step;
292 "scalar field cannot be null",
303 const std::string&
u,
304 const std::string&
v,
305 const std::shared_ptr<SymbolicExpr>&
u_lower,
306 const std::shared_ptr<SymbolicExpr>&
u_upper,
307 const std::shared_ptr<SymbolicExpr>&
v_lower,
308 const std::shared_ptr<SymbolicExpr>&
v_upper,
310 const std::string& operation)
312 auto step =
context.consume_steps(1, operation);
313 if (!step)
return step;
316 "surface vector field must have three components",
319 for (
const auto& component : F) {
322 "surface vector field components cannot be null",
332 const std::pair<std::shared_ptr<SymbolicExpr>, std::shared_ptr<SymbolicExpr>>& bounds,
334 const std::string& operation,
335 const std::string& label)
337 auto step =
context.consume_steps(1, operation);
338 if (!step)
return step;
341 label +
" bounds cannot be null",
348 const std::vector<std::string>&
vars,
349 std::size_t expected,
351 const std::string& operation)
353 auto step =
context.consume_steps(1, operation);
354 if (!step)
return step;
355 if (
vars.size() != expected) {
357 "variable list has the wrong dimension",
360 std::set<std::string> seen;
361 for (
const auto& var :
vars) {
364 "variable name cannot be empty",
367 if (!seen.insert(var).second) {
369 "variable names must be distinct",
377 const std::shared_ptr<SymbolicExpr>& expr,
378 const std::map<std::string, std::shared_ptr<SymbolicExpr>>&
point,
385 auto substituted = expr;
399 if (substituted->is_zero()) {
408 const std::map<std::string, std::shared_ptr<SymbolicExpr>>&
point,
409 const std::vector<std::string>&
vars)
411 for (
const auto& var :
vars) {
412 auto it =
point.find(var);
421 std::shared_ptr<SymbolicExpr> expr,
422 const std::string& operation)
427 "vector calculus construction produced a null expression",
435 const std::string& operation)
437 for (
const auto& component : field) {
441 "vector calculus construction produced a null component",
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::optional< double > try_finite_numeric(const SymbolicExpr &expression, ComputationContext &context)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< void > vector_calculus_validate_curve_scalar_inputs(const std::shared_ptr< SymbolicExpr > &f, const VectorField ¶metrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
bool vector_calculus_point_has_vars(const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, const std::vector< std::string > &vars)
Result< void > vector_calculus_validate_distinct_vars(const std::vector< std::string > &vars, std::size_t expected, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_surface_parametrization(const VectorField ¶metrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
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)
Result< void > vector_calculus_validate_surface_vector_inputs(const VectorField &F, const VectorField ¶metrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
bool vector_calculus_expr_zero_after_substitution(const std::shared_ptr< SymbolicExpr > &expr, const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_surface_scalar_inputs(const std::shared_ptr< SymbolicExpr > &f, const VectorField ¶metrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
static Result< void > vector_calculus_validate_surface_bounds(const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, const std::string &operation)
Result< void > vector_calculus_validate_curve_parametrization(const VectorField ¶metrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
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)
bool vector_calculus_checked_finite_numeric(const std::shared_ptr< SymbolicExpr > &expr, double &value, ComputationContext &context)
Result< void > vector_calculus_validate_curve_vector_inputs(const VectorField &F, const VectorField ¶metrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
VectorCalculusFieldResult vector_calculus_wrap_field(VectorField field, const std::string &operation)
Result< void > vector_calculus_validate_bound_pair(const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &bounds, ComputationContext &context, const std::string &operation, const std::string &label)
VectorCalculusExprResult vector_calculus_wrap_expr(std::shared_ptr< SymbolicExpr > expr, const std::string &operation)
Result< void > vector_calculus_validate_field_vars(const VectorField &field, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
const std::string const LimitExprPtr & point
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
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
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > & u_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_upper
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
std::vector< std::shared_ptr< SymbolicExpr > > VectorField
向量场由标量表达式组成。
Result< VectorField > VectorCalculusFieldResult
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField & parametrization
Result< std::shared_ptr< SymbolicExpr > > VectorCalculusExprResult
const std::string const ExprPtr & value
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & u_upper
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u
多项式方程组求解器 Solver,包含 Gröbner 基、线性系统求解。