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

类型定义

using ConditionSet = QueryInterface::ConditionSet
using ConditionSets = std::vector<ConditionSet>

函数

ConditionSets difference_conditions (const std::shared_ptr< const SymbolicNode > &pos_operand, const std::shared_ptr< const SymbolicNode > &neg_operand, Sign target)
ConditionSets product_conditions (const MultiplyNode &mul, Sign target)
ConditionSets quotient_conditions (const std::shared_ptr< const SymbolicNode > &numerator, const std::shared_ptr< const SymbolicNode > &denominator, Sign target)
std::shared_ptr< const SymbolicNode > subtracted_operand (const std::shared_ptr< const SymbolicNode > &node)
ConditionSets sum_conditions (const AddNode &add, Sign target)
ConditionSets variable_operand_conditions (const std::vector< std::shared_ptr< const SymbolicNode > > &operands, Sign target)

类型定义说明

◆ ConditionSet

using LMCAS::anonymous_namespace{query_conditions.cpp}::ConditionSet = QueryInterface::ConditionSet

在文件 query_conditions.cpp 第 7 行定义.

◆ ConditionSets

using LMCAS::anonymous_namespace{query_conditions.cpp}::ConditionSets = std::vector<ConditionSet>

在文件 query_conditions.cpp 第 8 行定义.

函数说明

◆ difference_conditions()

ConditionSets LMCAS::anonymous_namespace{query_conditions.cpp}::difference_conditions ( const std::shared_ptr< const SymbolicNode > & pos_operand,
const std::shared_ptr< const SymbolicNode > & neg_operand,
Sign target )

在文件 query_conditions.cpp 第 24 行定义.

26 {
27 const auto lhs_var = std::dynamic_pointer_cast<const VariableNode>(pos_operand);
28 const auto rhs_var = std::dynamic_pointer_cast<const VariableNode>(neg_operand);
29 if (!lhs_var || lhs_var->is_constant() ||
30 !rhs_var || rhs_var->is_constant()) return {};
31 if (target == Sign::Positive) {
32 ConditionSet cs1;
33 cs1.sign_conditions.emplace_back(lhs_var->name(), Sign::Positive);
34 cs1.sign_conditions.emplace_back(rhs_var->name(), Sign::Negative);
35 ConditionSet cs2;
36 auto lhs_expr = LMCAS::detail::expression_from_node(pos_operand);
37 auto rhs_expr = LMCAS::detail::expression_from_node(neg_operand);
38 Relation rel{lhs_expr, rhs_expr, RelationalNode::Op::GT};
39 cs2.relational_conditions.push_back(rel);
40 cs2.sign_conditions.emplace_back(rhs_var->name(), Sign::NonNegative);
41
42 return {cs1, cs2};
43 } else if (target == Sign::Negative) {
44 ConditionSet cs1;
45 cs1.sign_conditions.emplace_back(lhs_var->name(), Sign::Negative);
46 cs1.sign_conditions.emplace_back(rhs_var->name(), Sign::Positive);
47
48 ConditionSet cs2;
49 auto lhs_expr = LMCAS::detail::expression_from_node(pos_operand);
50 auto rhs_expr = LMCAS::detail::expression_from_node(neg_operand);
51 Relation rel{rhs_expr, lhs_expr, RelationalNode::Op::GT};
52 cs2.relational_conditions.push_back(rel);
53 cs2.sign_conditions.emplace_back(lhs_var->name(), Sign::NonNegative);
54
55 return {cs1, cs2};
56 } else if (target == Sign::NonNegative) {
57 ConditionSet cs1;
58 cs1.sign_conditions.emplace_back(lhs_var->name(), Sign::NonNegative);
59 cs1.sign_conditions.emplace_back(rhs_var->name(), Sign::NonPositive);
60
61 ConditionSet cs2;
62 auto lhs_expr = LMCAS::detail::expression_from_node(pos_operand);
63 auto rhs_expr = LMCAS::detail::expression_from_node(neg_operand);
64 Relation rel{lhs_expr, rhs_expr, RelationalNode::Op::GEQ};
65 cs2.relational_conditions.push_back(rel);
66
67 return {cs1, cs2};
68 }
69 return {};
70}
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
const ExprPtr & target
A stored relational constraint between two symbolic expressions.

引用了 difference_conditions(), LMCAS::detail::expression_from_node(), LMCAS::Negative, LMCAS::NonNegative, LMCAS::NonPositive, LMCAS::Positive , 以及 LMCAS::target.

被这些函数引用 difference_conditions() , 以及 sum_conditions().

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

◆ product_conditions()

ConditionSets LMCAS::anonymous_namespace{query_conditions.cpp}::product_conditions ( const MultiplyNode & mul,
Sign target )

在文件 query_conditions.cpp 第 131 行定义.

131 {
132 if (mul.operands().size() == 2) {
133 for (std::size_t i = 0; i < 2; ++i) {
134 const auto power = std::dynamic_pointer_cast<const PowerNode>(mul.operands()[i]);
135 const auto exponent =
136 power ? std::dynamic_pointer_cast<const NumberNode>(
137 power->exponent())
138 : nullptr;
139 if (exponent && exponent->is_negative_one()) {
140 return quotient_conditions(mul.operands()[1 - i], power->base(), target);
141 }
142 }
143 }
144 if (target == Sign::Positive) {
146 }
147 return {};
148}
ConditionSets quotient_conditions(const std::shared_ptr< const SymbolicNode > &numerator, const std::shared_ptr< const SymbolicNode > &denominator, Sign target)
ConditionSets variable_operand_conditions(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, Sign target)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const ExprPtr & exponent

引用了 LMCAS::exponent, LMCAS::mul(), LMCAS::Positive, product_conditions(), quotient_conditions(), LMCAS::target , 以及 variable_operand_conditions().

被这些函数引用 product_conditions().

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

◆ quotient_conditions()

ConditionSets LMCAS::anonymous_namespace{query_conditions.cpp}::quotient_conditions ( const std::shared_ptr< const SymbolicNode > & numerator,
const std::shared_ptr< const SymbolicNode > & denominator,
Sign target )

在文件 query_conditions.cpp 第 100 行定义.

102 {
103 const auto num_var = std::dynamic_pointer_cast<const VariableNode>(numerator);
104 const auto den_var = std::dynamic_pointer_cast<const VariableNode>(denominator);
105 if (!num_var || num_var->is_constant() ||
106 !den_var || den_var->is_constant()) return {};
107 if (target == Sign::Positive) {
108 ConditionSet cs1;
109 cs1.sign_conditions.emplace_back(num_var->name(), Sign::Positive);
110 cs1.sign_conditions.emplace_back(den_var->name(), Sign::Positive);
111
112 ConditionSet cs2;
113 cs2.sign_conditions.emplace_back(num_var->name(), Sign::Negative);
114 cs2.sign_conditions.emplace_back(den_var->name(), Sign::Negative);
115
116 return {cs1, cs2};
117 } else if (target == Sign::Negative) {
118 ConditionSet cs1;
119 cs1.sign_conditions.emplace_back(num_var->name(), Sign::Positive);
120 cs1.sign_conditions.emplace_back(den_var->name(), Sign::Negative);
121
122 ConditionSet cs2;
123 cs2.sign_conditions.emplace_back(num_var->name(), Sign::Negative);
124 cs2.sign_conditions.emplace_back(den_var->name(), Sign::Positive);
125
126 return {cs1, cs2};
127 }
128 return {};
129}
const ExprPtr & denominator

引用了 LMCAS::denominator, LMCAS::Negative, LMCAS::Positive, quotient_conditions() , 以及 LMCAS::target.

被这些函数引用 product_conditions() , 以及 quotient_conditions().

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

◆ subtracted_operand()

std::shared_ptr< const SymbolicNode > LMCAS::anonymous_namespace{query_conditions.cpp}::subtracted_operand ( const std::shared_ptr< const SymbolicNode > & node)

在文件 query_conditions.cpp 第 10 行定义.

11 {
12 const auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node);
13 if (!mul || mul->operands().size() != 2) return nullptr;
14 for (std::size_t j = 0; j < 2; ++j) {
15 const auto coefficient =
16 std::dynamic_pointer_cast<const NumberNode>(mul->operands()[j]);
17 if (coefficient && coefficient->is_negative_one()) {
18 return mul->operands()[1 - j];
19 }
20 }
21 return nullptr;
22}

引用了 LMCAS::mul() , 以及 subtracted_operand().

被这些函数引用 subtracted_operand() , 以及 sum_conditions().

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

◆ sum_conditions()

ConditionSets LMCAS::anonymous_namespace{query_conditions.cpp}::sum_conditions ( const AddNode & add,
Sign target )

在文件 query_conditions.cpp 第 84 行定义.

84 {
85 if (add.operands().size() == 2) {
86 for (std::size_t i = 0; i < 2; ++i) {
87 const auto negative = subtracted_operand(add.operands()[i]);
88 if (!negative) continue;
89 auto result = difference_conditions(add.operands()[1 - i], negative, target);
90 if (!result.empty()) return result;
91 break;
92 }
93 }
95 return variable_operand_conditions(add.operands(), target);
96 }
97 return {};
98}
ConditionSets difference_conditions(const std::shared_ptr< const SymbolicNode > &pos_operand, const std::shared_ptr< const SymbolicNode > &neg_operand, Sign target)
std::shared_ptr< const SymbolicNode > subtracted_operand(const std::shared_ptr< const SymbolicNode > &node)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::add(), difference_conditions(), LMCAS::NonNegative, LMCAS::Positive, subtracted_operand(), sum_conditions(), LMCAS::target , 以及 variable_operand_conditions().

被这些函数引用 sum_conditions().

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

◆ variable_operand_conditions()

ConditionSets LMCAS::anonymous_namespace{query_conditions.cpp}::variable_operand_conditions ( const std::vector< std::shared_ptr< const SymbolicNode > > & operands,
Sign target )

在文件 query_conditions.cpp 第 72 行定义.

73 {
74 ConditionSet cs;
75 for (const auto& operand : operands) {
76 const auto variable = std::dynamic_pointer_cast<const VariableNode>(operand);
77 if (!variable || variable->is_constant()) return {};
78 cs.sign_conditions.emplace_back(variable->name(), target);
79 }
80 if (cs.sign_conditions.empty()) return {};
81 return {cs};
82}
const std::string & variable

引用了 LMCAS::target, LMCAS::variable , 以及 variable_operand_conditions().

被这些函数引用 product_conditions(), sum_conditions() , 以及 variable_operand_conditions().

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