10RelationStore::RelationStore(RelationStore&& other) noexcept
11 : relations_(std::move(other.relations_)), proofs_(std::move(other.proofs_)),
12 declaration_order_(std::move(other.declaration_order_)) {
13 other.relations_.clear();
14 other.proofs_.clear();
15 other.declaration_order_.clear();
19RelationStore& RelationStore::operator=(
const RelationStore& other) {
21 RelationStore candidate(other);
22 relations_.swap(candidate.relations_);
23 proofs_.swap(candidate.proofs_);
24 declaration_order_.swap(candidate.declaration_order_);
30RelationStore& RelationStore::operator=(RelationStore&& other)
noexcept {
32 relations_ = std::move(other.relations_);
33 proofs_ = std::move(other.proofs_);
34 declaration_order_ = std::move(other.declaration_order_);
35 other.relations_.clear();
36 other.proofs_.clear();
37 other.declaration_order_.clear();
80 static constexpr SignRule rules[] = {
87 for (
const auto& rule : rules) {
88 if (rule.op ==
op)
return store.declare_sign(symbol, rule.sign);
95 const SymbolicExpr&
rhs,
104 if (zero && zero->is_zero() && reversed_variable &&
105 !reversed_variable->is_constant()) {
115 const SymbolicExpr& lhs,
116 const SymbolicExpr&
rhs,
118 PropertyStore& prop_store) {
119 auto index = find_relation(lhs,
rhs,
op);
121 index = relations_.size();
122 relations_.push_back(Relation{lhs,
rhs,
op});
123 proofs_.push_back(RelationProofs{});
125 const bool already_declared = proofs_[*index].declared;
126 if (!already_declared) {
127 proofs_[*index].declared =
true;
128 declaration_order_.push_back(*index);
136 if (!derived)
return derived;
140 auto closure = compute_transitive_closure(*index, prop_store);
142 if (already_declared && closure.value()) {
144 declaration_order_.push_back(*index);
151 const SymbolicExpr& lhs,
152 const SymbolicExpr&
rhs,
154 PropertyStore& prop_store) {
155 return add_relation_checked(lhs,
rhs,
op, prop_store);
159 const SymbolicExpr& lhs,
160 const SymbolicExpr&
rhs,
162 PropertyStore& prop_store) {
173 RelationStore relation_candidate = *
this;
174 PropertyStore property_candidate = prop_store;
175 auto inserted = relation_candidate.add_relation_unchecked(
176 lhs,
rhs,
op, property_candidate);
177 if (!inserted)
return inserted;
178 *
this = std::move(relation_candidate);
179 prop_store = std::move(property_candidate);
180 }
catch (
const std::bad_alloc&) {
183 }
catch (
const std::invalid_argument& ex) {
185 }
catch (
const std::exception& ex) {
199 const Relation& deduced, Premises premises,
201 if (premises[1] < premises[0]) std::swap(premises[0], premises[1]);
202 if (
const auto index = find_relation(deduced.
lhs, deduced.
rhs, deduced.
op)) {
203 if (premises[0] == *index || premises[1] == *index) {
206 auto& alternatives = proofs_[*index].alternatives;
207 if (std::find(alternatives.begin(), alternatives.end(), premises) ==
208 alternatives.end()) {
209 alternatives.push_back(premises);
214 if (work.
deductions == MAX_TRANSITIVE_DEDUCTIONS) {
217 relations_.push_back(deduced);
218 proofs_.push_back(RelationProofs{
false, {premises}});
222 deduced.
lhs, deduced.
rhs, deduced.
op, prop_store);
223 if (!derived)
return derived;
224 work.
queue.push(relations_.size() - 1);
229 std::size_t new_relation, PropertyStore& prop_store) {
231 work.
queue.push(new_relation);
232 while (!work.queue.empty()) {
233 const auto current_index = work.queue.front();
234 const auto current = relations_[current_index];
240 const std::size_t relation_count = relations_.size();
241 for (std::size_t i = 0; i < relation_count; ++i) {
243 if (!
expr_equals(current.rhs, relations_[i].lhs))
continue;
244 auto result = enqueue_transitive_deduction(
245 {current.lhs, relations_[i].rhs,
combine_ops(current.op, relations_[i].op)},
246 {current_index, i}, prop_store, work);
249 for (std::size_t i = 0; i < relation_count; ++i) {
252 auto result = enqueue_transitive_deduction(
253 {relations_[i].lhs, current.rhs,
combine_ops(relations_[i].
op, current.op)},
254 {i, current_index}, prop_store, work);
261const std::vector<Relation>& RelationStore::get_relations()
const {
265std::optional<std::size_t> RelationStore::find_relation(
266 const SymbolicExpr& lhs,
const SymbolicExpr&
rhs,
RelationOp op)
const {
267 for (std::size_t i = 0; i < relations_.size(); ++i) {
268 const auto&
relation = relations_[i];
277bool RelationStore::has_relation(
const SymbolicExpr& lhs,
const SymbolicExpr&
rhs,
279 return find_relation(lhs,
rhs,
op).has_value();
282void RelationStore::clear() {
283 if (!relations_.empty()) {
286 declaration_order_.clear();
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
bool equals(const SymbolicNode &other) const
判断两个节点是否结构相等.
RelationStoreResult declare_comparison_sign(const std::string &symbol, RelationOp op, PropertyStore &store)
RelationOp combine_ops(RelationOp op1, RelationOp op2)
Combine two transitive operators according to the combination rules: GT+GT→GT, GT+GEQ→GT,...
bool expr_equals(const SymbolicExpr &a, const SymbolicExpr &b)
Check structural equality of two expression roots.
bool is_transitive_op(RelationOp op)
Check if an operator participates in transitive closure.
RelationStoreResult derive_comparison_sign(const SymbolicExpr &lhs, const SymbolicExpr &rhs, RelationOp op, PropertyStore &store)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
constexpr RelationOp reversed_relation(RelationOp op) noexcept
const std::string & variable
RelationOp
Stable relational operator used by public APIs.
const ExprPtr RelationOp op
__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
Result< void > RelationStoreResult
SymbolicExpr lhs
Left-hand side expression
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
SymbolicExpr rhs
Right-hand side expression
Sign
Sign classification for symbols and expressions.
RelationOp op
Relational operator (GT, LT, GEQ, LEQ, NEQ, EQ)
A stored relational constraint between two symbolic expressions.
PropertyStore class for mapping symbol names to declared properties.
RelationStore class for storing relational constraints between symbolic expressions.
std::queue< std::size_t > queue