LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::detail::anonymous_namespace{complex_quadratic.cpp} 命名空间参考

类

struct  CartesianNodes

类型定义

using Coefficients = std::array<std::shared_ptr<SymbolicExpr>, 3>
using Node = std::shared_ptr<const SymbolicNode>

函数

Node add (const Node &left, const Node &right)
CartesianNodes cartesian_add (const CartesianNodes &left, const CartesianNodes &right)
CartesianNodes cartesian_multiply (const CartesianNodes &left, const CartesianNodes &right)
Result< CartesianQuadraticRoots > construct_roots (const Coefficients &coefficients, const Node &delta, bool negative, ComputationContext &context)
Node divide (const Node &numerator, const Node &denominator)
Node integer (int value)
Node multiply (const Node &left, const Node &right)
Node negate (const Node &value)
Result< bool > negative_discriminant (const SymbolicExpr &delta, const AssumptionContext &facts, ComputationContext &context)
ExpressionResult normalize (const Node &value, ComputationContext &context)
Result< Coefficients > normalize_coefficients (const Coefficients &input, ComputationContext &context)
Result< QuadraticCartesianRoot > normalized_root (const Node &real, const Node &imag, ComputationContext &context)
Result< void > prove_coefficients (const Coefficients &coefficients, const AssumptionContext &facts, ComputationContext &context)
Result< void > prove_zero (const Node &residual, ComputationContext &context)
Result< CartesianQuadraticRoots > solve_real_quadratic (const Coefficients &coefficients, const AssumptionContext &facts, ComputationContext &context)
Result< void > verify_root (const Coefficients &coefficients, const QuadraticCartesianRoot &root, ComputationContext &context)

变量

constexpr const char * kOperation = "solve_complex_quadratic"

类说明

◆ LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes

struct LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes

在文件 complex_quadratic.cpp 第 185 行定义.

LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes 的协作图:
类成员
Node imag
Node real

类型定义说明

◆ Coefficients

using LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::Coefficients = std::array<std::shared_ptr<SymbolicExpr>, 3>

在文件 complex_quadratic.cpp 第 19 行定义.

◆ Node

using LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::Node = std::shared_ptr<const SymbolicNode>

在文件 complex_quadratic.cpp 第 18 行定义.

函数说明

◆ add()

Node LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::add ( const Node & left,
const Node & right )

在文件 complex_quadratic.cpp 第 25 行定义.

25 {
26 return SymbolicFactory::create_add({left, right});
27}
static std::shared_ptr< const SymbolicNode > create_add(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建加法节点,自动扁平化嵌套加法并消除零项.
const ExprPtr & right

引用了 add(), LMCAS::SymbolicFactory::create_add() , 以及 LMCAS::right.

被这些函数引用 add(), cartesian_add(), cartesian_multiply(), construct_roots() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ cartesian_add()

CartesianNodes LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::cartesian_add ( const CartesianNodes & left,
const CartesianNodes & right )

在文件 complex_quadratic.cpp 第 190 行定义.

引用了 add(), cartesian_add(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes::imag, LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes::real , 以及 LMCAS::right.

被这些函数引用 cartesian_add() , 以及 verify_root().

函数调用图:
这是这个函数的调用关系图:

◆ cartesian_multiply()

CartesianNodes LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::cartesian_multiply ( const CartesianNodes & left,
const CartesianNodes & right )

在文件 complex_quadratic.cpp 第 194 行定义.

194 {
195 return {add(multiply(left.real, right.real), negate(multiply(left.imag, right.imag))),
196 add(multiply(left.real, right.imag), multiply(left.imag, right.real))};
197}

引用了 add(), cartesian_multiply(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes::imag, multiply(), negate(), LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::CartesianNodes::real , 以及 LMCAS::right.

被这些函数引用 cartesian_multiply() , 以及 verify_root().

函数调用图:
这是这个函数的调用关系图:

◆ construct_roots()

Result< CartesianQuadraticRoots > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::construct_roots ( const Coefficients & coefficients,
const Node & delta,
bool negative,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 161 行定义.

163 {
164 const auto denominator = multiply(integer(2), node(coefficients[0]));
165 const auto minus_b = negate(node(coefficients[1]));
166 const auto radical = SymbolicFactory::create_power(
167 negative ? negate(delta) : delta, SymbolicFactory::create_number(Rational(1, 2)));
168 const auto real = divide(minus_b, denominator);
169 const auto imag = divide(radical, denominator);
170 auto first = normalized_root(
171 negative ? real : add(real, imag),
172 negative ? imag : integer(0), context);
173 if (!first) {
174 return Result<CartesianQuadraticRoots>::failure(first.error());
175 }
176 auto second = normalized_root(
177 negative ? real : add(real, negate(imag)),
178 negative ? negate(imag) : integer(0), context);
179 if (!second) {
180 return Result<CartesianQuadraticRoots>::failure(second.error());
181 }
182 return CartesianQuadraticRoots{std::move(first.value()), std::move(second.value())};
183}
static Result failure(CasErrc code, std::string message, std::string operation={})
static std::shared_ptr< const SymbolicNode > create_power(std::shared_ptr< const SymbolicNode > base, std::shared_ptr< const SymbolicNode > exponent)
创建幂运算节点,自动处理指数为 0/1 及底数为 0/1 的情况.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
Node divide(const Node &numerator, const Node &denominator)
Result< QuadraticCartesianRoot > normalized_root(const Node &real, const Node &imag, ComputationContext &context)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::array< QuadraticCartesianRoot, 2 > CartesianQuadraticRoots
std::size_t std::size_t ComputationContext & context
std::shared_ptr< SymbolicExpr > negate(const std::shared_ptr< SymbolicExpr > &expr)
ExprResult integer(Integer)=delete
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprPtr imag
const ExprPtr & denominator

引用了 add(), construct_roots(), LMCAS::detail::context, LMCAS::SymbolicFactory::create_number(), LMCAS::SymbolicFactory::create_power(), LMCAS::denominator, divide(), LMCAS::Result< T >::failure(), LMCAS::imag, integer(), multiply(), negate(), LMCAS::detail::node(), normalized_root() , 以及 LMCAS::real().

被这些函数引用 construct_roots() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ divide()

Node LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::divide ( const Node & numerator,
const Node & denominator )

在文件 complex_quadratic.cpp 第 37 行定义.

37 {
39}

引用了 LMCAS::SymbolicFactory::create_power(), LMCAS::denominator, divide(), integer() , 以及 multiply().

被这些函数引用 construct_roots() , 以及 divide().

函数调用图:
这是这个函数的调用关系图:

◆ integer()

Node LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::integer ( int value)

在文件 complex_quadratic.cpp 第 21 行定义.

21 {
23}
const std::string const ExprPtr & value

引用了 LMCAS::SymbolicFactory::create_number(), integer() , 以及 LMCAS::value.

被这些函数引用 construct_roots(), divide(), integer(), negate(), solve_real_quadratic() , 以及 verify_root().

函数调用图:
这是这个函数的调用关系图:

◆ multiply()

Node LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::multiply ( const Node & left,
const Node & right )

在文件 complex_quadratic.cpp 第 29 行定义.

29 {
31}
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.

引用了 LMCAS::SymbolicFactory::create_multiply(), multiply() , 以及 LMCAS::right.

被这些函数引用 cartesian_multiply(), construct_roots(), divide(), multiply(), negate() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ negate()

Node LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::negate ( const Node & value)

在文件 complex_quadratic.cpp 第 33 行定义.

33 {
34 return multiply(integer(-1), value);
35}

引用了 integer(), multiply(), negate() , 以及 LMCAS::value.

被这些函数引用 cartesian_multiply(), construct_roots(), negate() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ negative_discriminant()

Result< bool > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::negative_discriminant ( const SymbolicExpr & delta,
const AssumptionContext & facts,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 123 行定义.

125 {
126 auto step = context.consume_steps(2, kOperation);
127 if (!step) {
128 return Result<bool>::failure(step.error());
129 }
130 auto nonnegative = facts.is_nonnegative_checked(delta, context);
131 if (!nonnegative) {
132 return Result<bool>::failure(nonnegative.error());
133 }
134 if (nonnegative.value() == Tribool::True) {
135 return false;
136 }
137 auto negative = facts.is_negative_checked(delta, context);
138 if (!negative) {
139 return Result<bool>::failure(negative.error());
140 }
141 if (negative.value() == Tribool::True) {
142 return true;
143 }
145 "quadratic discriminant sign is unknown", kOperation);
146}
RewriteBudget const FactsQuery & facts
@ True
Property definitely holds

引用了 LMCAS::detail::context, LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::Inconclusive, kOperation, negative_discriminant() , 以及 LMCAS::True.

被这些函数引用 negative_discriminant() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ normalize()

ExpressionResult LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalize ( const Node & value,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 41 行定义.

41 {
42 auto step = context.consume_steps(1, kOperation);
43 if (!step) {
44 return ExpressionResult::failure(step.error());
45 }
46 RewriteBudget budget(context, context.limits().max_recursion_depth,
47 context.limits().max_ast_nodes, kOperation);
49 std::optional<AssumptionFacts> facts;
50 if (context.assumptions()) facts.emplace(*context.assumptions());
51 NormalizationVisitor visitor(budget, facts ? static_cast<const FactsQuery&>(*facts)
53 value->accept(visitor);
54 auto result = visitor.get_result();
55 if (!result) {
57 "quadratic normalization returned null", kOperation);
58 }
59 budget.measure(result);
60 return make_expression_ptr(std::move(result));
61}
统一规范化数值幂。 精确操作数保留整数和有理数运算;近似求根要求指数精确等于 1/2。 有限浮点幂直接折叠,省去倒数中间值;非有限结果保留幂表达式。
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const FactsQuery & no_facts() noexcept
@ Real
Real numbers

引用了 LMCAS::detail::budget, LMCAS::detail::context, LMCAS::detail::facts, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::NormalizationVisitor::get_result(), LMCAS::InternalInvariant, kOperation, LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::no_facts(), normalize(), LMCAS::Real , 以及 LMCAS::value.

被这些函数引用 normalize(), normalize_coefficients(), normalized_root(), prove_zero() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ normalize_coefficients()

Result< Coefficients > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalize_coefficients ( const Coefficients & input,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 63 行定义.

64 {
65 for (const auto& coefficient : input) {
66 auto step = context.consume_steps(1, kOperation);
67 if (!step) {
68 return Result<Coefficients>::failure(step.error());
69 }
70 if (!coefficient || !node(coefficient)) {
72 "quadratic coefficients must not be null", kOperation);
73 }
74 }
75 Coefficients result;
76 for (std::size_t i = 0; i < input.size(); ++i) {
77 auto simplified = normalize(node(input[i]), context);
78 if (!simplified) {
79 return Result<Coefficients>::failure(simplified.error());
80 }
81 result[i] = std::move(simplified.value());
82 }
83 return result;
84}
ExpressionResult normalize(const Node &value, ComputationContext &context)
std::array< std::shared_ptr< SymbolicExpr >, 3 > Coefficients

引用了 LMCAS::detail::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, kOperation, LMCAS::detail::node(), normalize() , 以及 normalize_coefficients().

被这些函数引用 normalize_coefficients().

函数调用图:
这是这个函数的调用关系图:

◆ normalized_root()

Result< QuadraticCartesianRoot > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::normalized_root ( const Node & real,
const Node & imag,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 148 行定义.

149 {
150 auto real_part = normalize(real, context);
151 if (!real_part) {
152 return Result<QuadraticCartesianRoot>::failure(real_part.error());
153 }
154 auto imag_part = normalize(imag, context);
155 if (!imag_part) {
156 return Result<QuadraticCartesianRoot>::failure(imag_part.error());
157 }
158 return QuadraticCartesianRoot{std::move(real_part.value()), std::move(imag_part.value())};
159}

引用了 LMCAS::detail::context, LMCAS::Result< T >::failure(), LMCAS::imag, normalize(), normalized_root() , 以及 LMCAS::real().

被这些函数引用 construct_roots() , 以及 normalized_root().

函数调用图:
这是这个函数的调用关系图:

◆ prove_coefficients()

Result< void > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::prove_coefficients ( const Coefficients & coefficients,
const AssumptionContext & facts,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 86 行定义.

88 {
89 auto step = context.consume_steps(4, kOperation);
90 if (!step) {
91 return step;
92 }
93 if (node(coefficients[0])->is_zero()) {
95 "quadratic leading coefficient is zero", kOperation);
96 }
97 AssumptionFacts adapter(facts);
98 for (const auto& coefficient : coefficients) {
99 auto real = query_real_value(node(coefficient), adapter, context);
100 if (!real) {
102 }
103 if (real.value() != Tribool::True) {
105 "quadratic coefficients must be provably real", kOperation);
106 }
107 }
108 auto nonzero = facts.is_nonzero_checked(*coefficients[0], context);
109 if (!nonzero) {
110 return Result<void>::failure(nonzero.error());
111 }
112 if (nonzero.value() == Tribool::False) {
114 "quadratic leading coefficient is zero", kOperation);
115 }
116 if (nonzero.value() != Tribool::True) {
118 "quadratic leading coefficient is not provably nonzero", kOperation);
119 }
120 return Result<void>::success();
121}
CasError & error()
static Result success(T value)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ False
Property definitely does not hold

引用了 LMCAS::detail::context, LMCAS::DomainError, LMCAS::Result< T >::error(), LMCAS::detail::facts, LMCAS::Result< T >::failure(), LMCAS::False, LMCAS::Inconclusive, kOperation, LMCAS::detail::node(), prove_coefficients(), LMCAS::detail::query_real_value(), LMCAS::real(), LMCAS::Result< T >::success(), LMCAS::True, LMCAS::UnsupportedExpression , 以及 LMCAS::Result< T >::value().

被这些函数引用 prove_coefficients() , 以及 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ prove_zero()

Result< void > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::prove_zero ( const Node & residual,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 199 行定义.

199 {
200 auto simplified = normalize(residual, context);
201 if (!simplified) {
202 return Result<void>::failure(simplified.error());
203 }
204 auto proof = check_zero_residual(simplified.value(), context);
205 if (!proof) {
206 return Result<void>::failure(proof.error());
207 }
208 if (!std::holds_alternative<ProvedZeroResidual>(proof.value())) {
210 "quadratic Cartesian residual could not be proved zero", kOperation);
211 }
212 return Result<void>::success();
213}
ResidualCheckResult check_zero_residual(const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)

引用了 LMCAS::check_zero_residual(), LMCAS::detail::context, LMCAS::Result< T >::failure(), LMCAS::Inconclusive, kOperation, normalize(), prove_zero() , 以及 LMCAS::Result< T >::success().

被这些函数引用 prove_zero() , 以及 verify_root().

函数调用图:
这是这个函数的调用关系图:

◆ solve_real_quadratic()

Result< CartesianQuadraticRoots > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::solve_real_quadratic ( const Coefficients & coefficients,
const AssumptionContext & facts,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 236 行定义.

238 {
239 auto valid = prove_coefficients(coefficients, facts, context);
240 if (!valid) {
241 return Result<CartesianQuadraticRoots>::failure(valid.error());
242 }
243 const auto b = node(coefficients[1]);
244 auto delta = normalize(add(multiply(b, b), negate(multiply(integer(4),
245 multiply(node(coefficients[0]), node(coefficients[2]))))), context);
246 if (!delta) {
247 return Result<CartesianQuadraticRoots>::failure(delta.error());
248 }
249 auto negative = negative_discriminant(*delta.value(), facts, context);
250 if (!negative) {
251 return Result<CartesianQuadraticRoots>::failure(negative.error());
252 }
253 auto roots = construct_roots(coefficients, node(delta.value()), negative.value(), context);
254 if (!roots) {
255 return roots;
256 }
257 for (const auto& root : roots.value()) {
258 auto verified = verify_root(coefficients, root, context);
259 if (!verified) {
260 return Result<CartesianQuadraticRoots>::failure(verified.error());
261 }
262 }
263 return roots;
264}
Result< CartesianQuadraticRoots > construct_roots(const Coefficients &coefficients, const Node &delta, bool negative, ComputationContext &context)
Result< bool > negative_discriminant(const SymbolicExpr &delta, const AssumptionContext &facts, ComputationContext &context)
Result< void > prove_coefficients(const Coefficients &coefficients, const AssumptionContext &facts, ComputationContext &context)
Result< void > verify_root(const Coefficients &coefficients, const QuadraticCartesianRoot &root, ComputationContext &context)
const MultiPoly & b
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)

引用了 add(), LMCAS::b, construct_roots(), LMCAS::detail::context, LMCAS::detail::facts, LMCAS::Result< T >::failure(), integer(), multiply(), negate(), negative_discriminant(), LMCAS::detail::node(), normalize(), prove_coefficients(), LMCAS::roots(), solve_real_quadratic(), LMCAS::Result< T >::value() , 以及 verify_root().

被这些函数引用 solve_real_quadratic().

函数调用图:
这是这个函数的调用关系图:

◆ verify_root()

Result< void > LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::verify_root ( const Coefficients & coefficients,
const QuadraticCartesianRoot & root,
ComputationContext & context )

在文件 complex_quadratic.cpp 第 215 行定义.

217 {
218 auto step = context.consume_steps(16, kOperation);
219 if (!step) {
220 return step;
221 }
222 const auto zero = integer(0);
223 const CartesianNodes a{node(coefficients[0]), zero};
224 const CartesianNodes b{node(coefficients[1]), zero};
225 const CartesianNodes c{node(coefficients[2]), zero};
226 const CartesianNodes z{node(root.real), node(root.imag)};
227 const auto residual = cartesian_add(
229 auto real = prove_zero(residual.real, context);
230 if (!real) {
231 return real;
232 }
233 return prove_zero(residual.imag, context);
234}
CartesianNodes cartesian_add(const CartesianNodes &left, const CartesianNodes &right)
Result< void > prove_zero(const Node &residual, ComputationContext &context)
CartesianNodes cartesian_multiply(const CartesianNodes &left, const CartesianNodes &right)
const VectorField const VectorField & c
__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

引用了 LMCAS::a, LMCAS::b, LMCAS::c, cartesian_add(), cartesian_multiply(), LMCAS::detail::context, LMCAS::detail::QuadraticCartesianRoot::imag, integer(), kOperation, LMCAS::detail::node(), prove_zero(), LMCAS::detail::QuadraticCartesianRoot::real, LMCAS::real() , 以及 verify_root().

被这些函数引用 solve_real_quadratic() , 以及 verify_root().

函数调用图:
这是这个函数的调用关系图:

变量说明

◆ kOperation

const char* LMCAS::detail::anonymous_namespace{complex_quadratic.cpp}::kOperation = "solve_complex_quadratic"
constexpr