LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expression_transform.hpp
浏览该文件的文档.
1#pragma once
2
4#include "symbolic.hpp"
8#include <exception>
9#include <memory>
10#include <string>
11#include <utility>
12
13namespace LMCAS::detail {
14
22 const SymbolicNodePtr& node, const std::string& variable, RewriteBudget& budget,
25 const SymbolicNodePtr& node, const std::string& variable,
28
29template <typename Transform>
32 const char* operation,
33 const char* transform_name,
34 Transform&& transform) {
35 auto step = context.consume_steps(1, operation);
36 if (!step) return ExpressionResult::failure(step.error());
37 if (!expression || !LMCAS::detail::node(expression)) {
39 std::string(transform_name) +
40 " argument cannot be null",
41 operation);
42 }
43 try {
44 auto result = std::forward<Transform>(transform)(*expression);
45 if (!result || !LMCAS::detail::node(result)) {
47 std::string(transform_name) +
48 " returned null",
49 operation);
50 }
51 return ExpressionResult::success(std::move(result));
52 } catch (const CasError& error) {
53 return ExpressionResult::failure(error);
54 } catch (const std::bad_alloc&) {
56 std::string(transform_name) +
57 " allocation failed",
58 operation);
59 } catch (const std::length_error& error) {
61 operation);
62 } catch (const std::exception& error) {
64 operation);
65 }
66}
67
68}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(std::shared_ptr< SymbolicExpr > value)
#define LMCAS_API
多元 Hensel 提升(单变量步)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExpressionResult checked_transform_expr(const ExprPtr &expression, ComputationContext &context, const char *operation, const char *transform_name, Transform &&transform)
const std::string & variable
const std::string const SymbolicNodePtr & replacement
RewriteBudget const FactsQuery Domain domain
std::shared_ptr< const SymbolicNode > SymbolicNodePtr
const FactsQuery & no_facts() noexcept
RewriteBudget const FactsQuery & facts
ComputationContext const std::string & operation
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::size_t std::size_t ComputationContext & context
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Real
Real numbers
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
std::shared_ptr< SymbolicExpr > ExprPtr
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.
内部 AST 定义。