19 if (std::dynamic_pointer_cast<const ComplexNode>(node)) {
22 if (
auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
23 for (
const auto& argument :
function->arguments()) {
30 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
31 for (
const auto& operand :
add->operands()) {
38 if (
auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
39 for (
const auto& operand : multiply->operands()) {
46 if (
auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
58 if (std::holds_alternative<BigInt>(number->value())) {
59 return std::get<BigInt>(number->value()) < BigInt(0);
61 return std::get<Rational>(number->value()) < Rational(0);
68 (
context).limits().max_ast_nodes,
"transform");
74 auto number = argument
81 const std::shared_ptr<const SymbolicNode>& node, ComputationContext&
context);
86 for (
const auto& child : children) {
100 if (
auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
106 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
109 if (
auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
112 if (
auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
116 if (
auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
130 const std::shared_ptr<SymbolicExpr>& candidate,
135 (
context).limits().max_ast_nodes,
"transform");
136 real_candidate.reset();
148 if (
auto complex = std::dynamic_pointer_cast<const ComplexNode>(
154 if (
imag->is_zero()) {
159 real_candidate =
real;
169 real_candidate = simplified_candidate;
173 const std::vector<std::shared_ptr<SymbolicExpr>>& candidates,
174 const std::shared_ptr<SymbolicExpr>& candidate)
176 for (
const auto& existing : candidates) {
186 const std::vector<std::shared_ptr<SymbolicExpr>>& candidates,
187 const std::shared_ptr<SymbolicExpr>& equation,
const std::string& var,
192 (
context).limits().max_ast_nodes,
"transform");
193 std::vector<std::shared_ptr<SymbolicExpr>> real_candidates;
194 real_candidates.reserve(candidates.size());
195 for (
const auto& candidate : candidates) {
196 std::shared_ptr<SymbolicExpr> real_candidate;
201 "inverse derivative candidate reality could not be proven", operation);
211 "inverse derivative candidate verification produced a null residual", operation);
213 if (!simplified->is_zero()) {
217 real_candidates.push_back(real_candidate);
221}
catch (
const CasError& error) {
223}
catch (
const std::bad_alloc&) {
225}
catch (
const std::length_error& error) {
227}
catch (
const std::exception& error) {
232 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
233 const std::vector<std::shared_ptr<SymbolicExpr>>& candidates,
238 (
context).limits().max_ast_nodes,
"transform");
239 if (candidates.empty()) {
242 "inverse point is outside the proven range",
245 if (candidates.size() != 1) {
248 "inverse derivative requires a unique inverse branch",
256 "inverse derivative could not construct the derivative",
265 "inverse derivative substitution produced a null expression",
269 if (simplified_derivative->is_zero()) {
272 "inverse derivative is undefined where f' is zero",
276 auto result = SymbolicExpr::divide(SymbolicExpr::number(1), simplified_derivative);
281 "inverse derivative result construction failed",
285}
catch (
const CasError& error) {
287}
catch (
const std::bad_alloc&) {
289}
catch (
const std::length_error& error) {
291}
catch (
const std::exception& error) {
298 std::vector<std::shared_ptr<SymbolicExpr>> values;
299 values.reserve(finite.
values.size());
300 for (
const auto& solution : finite.
values) {
304 "checked solver returned a null inverse candidate",
311 "checked solver returned a malformed inverse candidate",
314 values.push_back(candidate);
320 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
321 const std::shared_ptr<SymbolicExpr>&
point,
324 const std::string operation =
"inverse_derivative";
329 auto step =
context.consume_steps(4, operation);
335 auto eq = SymbolicExpr::add(
336 f, SymbolicExpr::multiply(SymbolicExpr::number(-1),
point));
338 std::vector<std::shared_ptr<SymbolicExpr>> candidates;
341 candidates = inverse.value();
350 }
catch (
const std::bad_alloc&) {
352 "inverse derivative allocation failed",
354 }
catch (
const std::exception&
e) {
356 e.what(), operation);
361 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
362 const std::shared_ptr<SymbolicExpr>&
point)
369 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
372 const std::string operation =
"inverse_function";
377 auto step =
context.consume_steps(4, operation);
383 auto eq = SymbolicExpr::eq(f, y);
390 const auto& solutions = solved.
value();
391 if (std::holds_alternative<EmptySolutions>(solutions)) {
394 if (
const auto* finite = std::get_if<FiniteSolutions>(&solutions)) {
400 "inverse equation is outside the finite exact support domain",
402 }
catch (
const std::bad_alloc&) {
404 "inverse function allocation failed",
406 }
catch (
const std::exception&
e) {
408 e.what(), operation);
413 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
414 const std::shared_ptr<SymbolicExpr>& y)
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(std::vector< std::shared_ptr< SymbolicExpr > > value)
Result< void > calculus_utils_validate_expr_target(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const std::shared_ptr< SymbolicExpr > &target, ComputationContext &context, const std::string &operation)
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
bool contains_node_type(const SymbolicNodePtr &root)
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)
const std::string const LimitExprPtr & point
ExprResult eq(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::shared_ptr< SymbolicExpr > rootof_simplify(const std::shared_ptr< SymbolicExpr > &rootof_expr)
static CalculusRealCandidateStatus calculus_utils_extract_real_candidate(const std::shared_ptr< SymbolicExpr > &candidate, std::shared_ptr< SymbolicExpr > &real_candidate, ComputationContext &context)
static SymbolicExprVectorResult explicit_inverse_candidates(const FiniteSolutions &finite, const std::string &operation)
SymbolicExprVectorResult inverse_function_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &y, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult real(const ExprPtr &expression, ComputationContext &context)
static bool is_nonreal_sqrt(const FunctionNode &function, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
LMCAS::SolveResult solve_equation(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const SolveOptions &opts)
CalculusRealCandidateStatus
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
std::vector< FiniteSolution > values
static bool any_nonreal_sqrt(const std::vector< std::shared_ptr< const SymbolicNode > > &children, ComputationContext &context)
Result< std::vector< std::shared_ptr< SymbolicExpr > > > SymbolicExprVectorResult
ExpressionResult inverse_derivative_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
ExprResult complex(ExprPtr real, ExprPtr imag)
static bool contains_inverse_candidate(const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &candidate)
static ExpressionResult inverse_branch_derivative(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::string &operation, ComputationContext &context)
static SymbolicExprVectorResult verified_real_inverse_candidates(const std::vector< std::shared_ptr< SymbolicExpr > > &candidates, const std::shared_ptr< SymbolicExpr > &equation, const std::string &var, const std::string &operation, ComputationContext &context)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
static bool calculus_utils_contains_nonreal_sqrt(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context)
static bool calculus_utils_is_negative_number(const std::shared_ptr< const NumberNode > &number)
static bool calculus_utils_contains_complex(const std::shared_ptr< const SymbolicNode > &node)
方程求解策略调度器 solve_dispatch 及相关选项结构体.