14 const std::vector<std::shared_ptr<SymbolicExpr>>& vector,
15 const std::string&
name,
16 const std::string& operation)
18 for (
size_t i = 0; i < vector.size(); ++i) {
22 name +
" contains a null component at index " + std::to_string(i),
30 const std::vector<std::shared_ptr<SymbolicExpr>>&
a,
31 const std::vector<std::shared_ptr<SymbolicExpr>>&
b,
33 const std::string& operation)
35 auto step =
context.consume_steps(1, operation);
36 if (!step)
return step;
37 if (
a.empty() ||
b.empty()) {
41 if (
a.size() !=
b.size()) {
46 if (!a_check)
return a_check;
52 const std::vector<std::shared_ptr<SymbolicExpr>>&
point,
54 const std::string& operation)
56 auto step =
context.consume_steps(1, operation);
57 if (!step)
return step;
62 if (surf.
vars.empty()) {
69 "surface variable count must match point dimension",
72 for (
const auto& var : surf.
vars) {
83 const std::shared_ptr<SymbolicExpr>& expr,
84 const std::string& operation,
89 (
context).limits().max_ast_nodes,
"transform");
100}
catch (
const std::bad_alloc&) {
102}
catch (
const std::length_error& error) {
104}
catch (
const std::exception& error) {
109 const std::vector<std::shared_ptr<SymbolicExpr>>&
expressions,
111 const std::string& operation,
112 std::vector<double>* values)
114 double max_abs = 0.0;
123 "numeric vector contains a null expression",
135 "vector is not finite numeric in the supported domain",
138 if (!evaluated.value().is_finite() ||
139 !std::isfinite(evaluated.value().value)) {
142 "vector is not finite numeric in the supported domain",
145 max_abs = std::max(max_abs, std::abs(evaluated.value().value));
147 values->push_back(evaluated.value().value);
154 const std::vector<std::shared_ptr<SymbolicExpr>>&
expressions,
156 const std::string& operation,
157 const std::string& domain_message,
158 const std::string& inconclusive_message)
170 if (scaled.value() == 0.0) {
178 const std::shared_ptr<SymbolicExpr>& expr,
180 const std::string& operation,
181 const std::string& domain_message,
182 const std::string& inconclusive_message)
185 (
context).limits().max_ast_nodes,
"transform");
188 inconclusive_message, operation);
193 inconclusive_message, operation);
195 if (simplified->is_zero()) {
197 domain_message, operation);
206 inconclusive_message, operation);
208 if (!numeric.value().is_finite() ||
209 !std::isfinite(numeric.value().value)) {
211 inconclusive_message, operation);
213 if (numeric.value().value == 0.0) {
215 domain_message, operation);
220}
catch (
const std::bad_alloc&) {
222}
catch (
const std::length_error& error) {
224}
catch (
const std::exception& error) {
230 const std::string& operation)
234 if (!valid)
return valid;
235 if (line.
point.size() != 3) {
237 "line geometry requires 3-dimensional data",
242 "line direction cannot be zero",
243 "line direction nonzero condition cannot be verified");
248 const std::string& operation)
252 "plane constant cannot be null",
257 "plane geometry requires a 3-dimensional normal",
262 if (!normal_valid)
return normal_valid;
265 "plane normal cannot be zero",
266 "plane normal nonzero condition cannot be verified");
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
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< double > numeric_vector_scale_checked(const std::vector< std::shared_ptr< SymbolicExpr > > &expressions, ComputationContext &context, const std::string &operation, std::vector< double > *values=nullptr)
Result< void > validate_plane_checked(const PlaneSymbolic &plane, ComputationContext &context, const std::string &operation)
ExpressionResult simplify_checked(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, ComputationContext &context)
Result< void > validate_symbolic_vector(const std::vector< std::shared_ptr< SymbolicExpr > > &vector, const std::string &name, const std::string &operation)
Result< void > validate_surface_point(const SurfaceSymbolic &surf, const std::vector< std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, const std::string &operation)
Result< void > validate_line_checked(const LineSymbolic &line, ComputationContext &context, const std::string &operation)
Result< void > checked_nonzero_numeric_or_exact(const std::shared_ptr< SymbolicExpr > &expr, ComputationContext &context, const std::string &operation, const std::string &domain_message, const std::string &inconclusive_message)
Result< void > validate_same_dimension_vectors(const std::vector< std::shared_ptr< SymbolicExpr > > &a, const std::vector< std::shared_ptr< SymbolicExpr > > &b, ComputationContext &context, const std::string &operation)
Result< void > checked_nonzero_numeric_vector(const std::vector< std::shared_ptr< SymbolicExpr > > &expressions, ComputationContext &context, const std::string &operation, const std::string &domain_message, const std::string &inconclusive_message)
const std::string const LimitExprPtr & point
const PlaneSymbolic & plane
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
std::vector< std::shared_ptr< SymbolicExpr > > point
直线上一点。
__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 > > normal
法向量。
NumberDomainSet expressions()
std::vector< std::shared_ptr< SymbolicExpr > > direction
方向向量。
Result< ApproxReal > evaluate_numeric(const SymbolicExpr &expression, const NumericBindings &bindings={})
std::shared_ptr< SymbolicExpr > F
曲面方程左端,等于零。
std::unordered_map< std::string, double > NumericBindings
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
std::shared_ptr< SymbolicExpr > d
常数项。
std::vector< std::string > vars
坐标变量名 {x,y,z}。
由法向量和常数 d 定义的符号平面 ax + by + cz = d。