53 for (std::size_t
r = 0;
r < n.
rows(); ++
r)
54 for (std::size_t
c = 0;
c < n.
cols(); ++
c)
68 for (
const auto& branch : n.
branches()) {
69 emit(branch.expression);
emit(branch.condition);
131 if (
dynamic_cast<const MultiplyNode*
>(base.get()))
return true;
132 const auto* number =
dynamic_cast<const NumberNode*
>(base.get());
133 return number && std::holds_alternative<Rational>(number->value());
136 Rational& coefficient, std::vector<NodePtr>& remaining) {
137 bool exact_factor =
false;
138 for (
const auto& factor : factors) {
139 const auto* number =
dynamic_cast<const NumberNode*
>(factor.get());
141 remaining.push_back(factor);
144 const Rational
value = std::holds_alternative<BigInt>(number->value())
145 ? Rational(std::get<BigInt>(number->value()))
146 : std::get<Rational>(number->value());
149 coefficient = coefficient *
value;
162 std::vector<NodePtr> factors;
163 if (
const auto* product =
dynamic_cast<const MultiplyNode*
>(base.get()))
164 factors.assign(product->operands().begin(), product->operands().end());
166 factors.push_back(base);
167 std::vector<NodePtr> remaining;
168 remaining.reserve(factors.size() + 1);
170 return scaled_value(base, coefficient, remaining, exact_factor);
173 std::vector<NodePtr>& remaining,
bool exact_factor) {
174 if (exact_factor || coefficient != Rational(1)) {
175 if (coefficient != Rational(1) || remaining.empty()) {
176 remaining.push_back(coefficient.is_integer()
180 return remaining.size() == 1 ? remaining.front()
185 void put(std::string_view field) {
187 char digits[std::numeric_limits<std::size_t>::digits10 + 2];
188 auto end = std::to_chars(digits, digits +
sizeof(digits), field.size()).ptr;
189 const auto width =
static_cast<std::size_t
>(end - digits);
190 const auto extra = width + 2;
191 if (field.size() >
context_.limits().max_input_bytes ||
193 extra >
context_.limits().max_input_bytes - field.size() -
output_.size()) {
198 output_.append(field.data(), field.size());
202 char digits[std::numeric_limits<std::size_t>::digits10 + 2];
203 auto end = std::to_chars(digits, digits +
sizeof(digits),
value).ptr;
204 put(std::string_view(digits,
static_cast<std::size_t
>(end - digits)));
214 template <
typename Children>
217 for (
const auto& child : children)
emit(child);
224 }
catch (
const std::runtime_error& error) {
225 if (std::string_view(error.what()) ==
"AST traversal depth limit exceeded")
240 auto step =
context.consume_steps(1, kEncode);
244 "expression cannot be null", kEncode);
247 }
catch (
const CasError& error) {
249 }
catch (
const std::bad_alloc&) {
251 "expression serialization allocation failed", kEncode);
252 }
catch (
const std::exception& error) {
254 error.what(), kEncode);
260 return serialize_expr(expression,
context);
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
const std::shared_ptr< const SymbolicNode > & real() const noexcept
const std::shared_ptr< const SymbolicNode > & imag() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & elements() const noexcept
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
FuncType type() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments() const noexcept
const auto & body() const noexcept
const auto & upper() const noexcept
const auto & lower() const noexcept
bool is_definite() const noexcept
const std::string & variable() const noexcept
bool upper_closed() const noexcept
bool lower_closed() const noexcept
const auto & lower() const noexcept
const auto & upper() const noexcept
const std::string & variable() const noexcept
const auto & point() const noexcept
const auto & body() const noexcept
LimitDirection direction() const noexcept
@ Not
一元逻辑非,right 为 nullptr。
const std::shared_ptr< const SymbolicNode > & right() const noexcept
const std::shared_ptr< const SymbolicNode > & left() const noexcept
size_t cols() const noexcept
size_t rows() const noexcept
std::shared_ptr< const SymbolicNode > get(size_t r, size_t c) const
获取指定位置的矩阵元素。
const auto & set() const noexcept
const auto & element() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
const std::variant< BigInt, Rational > & value() const noexcept
const std::shared_ptr< const SymbolicNode > & default_expr() const noexcept
const std::vector< Branch > & branches() const noexcept
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
const std::shared_ptr< const SymbolicNode > & lower_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & upper_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & body() const noexcept
const std::string & index_var() const noexcept
Type quantifier_type() const noexcept
const std::string & bound_var() const noexcept
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
const auto & value() const noexcept
const Rational & scale_to_base() const noexcept
const auto & dimension() const noexcept
const std::shared_ptr< const SymbolicNode > & right() const noexcept
const std::shared_ptr< const SymbolicNode > & left() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
const std::string & variable() const noexcept
std::size_t index() const noexcept
const LMCAS::detail::ExactRootId & exact_id() const noexcept
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
const std::string & element_var() const noexcept
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
const std::shared_ptr< const SymbolicNode > & lower_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & body() const noexcept
const std::string & index_var() const noexcept
const std::shared_ptr< const SymbolicNode > & upper_bound() const noexcept
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
const auto & arguments() const noexcept
const std::string & name() const noexcept
bool is_constant() const noexcept
const std::string & name() const noexcept
void visit(const SummationNode &n) override
NodePtr base_value(const QuantityNode &n)
void visit(const IntervalNode &n) override
ComputationContext & context_
void put_size(std::size_t value)
void visit(const SetBuilderNode &n) override
bool needs_scale(const QuantityNode &n, const NodePtr &base)
void put_integer(const BigInt &value)
Writer(ComputationContext &context)
void visit(const NumberNode &n) override
void put_rational(const Rational &value)
void visit(const LimitNode &n) override
void emit(const NodePtr &node)
void visit(const IntegralNode &n) override
void visit(const VariableNode &n) override
void visit(const FiniteSetNode &n) override
std::string finish(const NodePtr &root)
NodePtr scaled_value(const NodePtr &base, const Rational &coefficient, std::vector< NodePtr > &remaining, bool exact_factor)
void visit(const QuantifierNode &n) override
void visit(const ProductNode &n) override
void visit(const QuantityNode &n) override
void visit(const FunctionNode &n) override
void visit(const PowerNode &n) override
void visit(const MatrixNode &n) override
void put(std::string_view field)
void visit(const UninterpretedFunctionNode &n) override
void visit(const PiecewiseNode &n) override
void visit(const AddNode &n) override
void visit(const ComplexNode &n) override
void visit(const MembershipNode &n) override
void visit(const RootOfNode &n) override
void visit(const TransformNode &n) override
void emit_list(const Children &children)
void visit(const MultiplyNode &n) override
bool collect_exact_factors(const std::vector< NodePtr > &factors, Rational &coefficient, std::vector< NodePtr > &remaining)
void visit(const RelationalNode &n) override
void visit(const LogicalNode &n) override
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::string_view enum_name(Enum value, const std::array< std::string_view, N > &names, const char *operation)
constexpr std::array< std::string_view, 36 > kFunctions
detail::SymbolicNodePtr NodePtr
constexpr std::array< std::string_view, 5 > kTransforms
constexpr std::array< std::string_view, 3 > kDirections
constexpr const char * kEncode
constexpr std::string_view kHeader
constexpr std::array< std::string_view, 6 > kRelations
constexpr std::array< std::string_view, 2 > kQuantifiers
void check(Result< void > result)
constexpr std::array< std::string_view, 4 > kLogic
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult integer(Integer)=delete
const VectorField const VectorField & c
std::size_t std::size_t depth
std::shared_ptr< SymbolicExpr > ExprPtr
const std::string const ExprPtr & value
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
Polynomial< Rational > polynomial