16template <
typename Transform>
19 Transform&& transform) {
22 [&](
const SymbolicExpr&
value) {
25 std::optional<AssumptionFacts>
facts;
35 return assumed_transform(expression,
context,
"LMCAS.simplify",
"simplify",
42 return assumed_transform(expression,
context,
"LMCAS.expand",
"expand",
51 return assumed_transform(expression,
context,
"LMCAS.differentiate",
"differentiate",
61 return assumed_transform(expression,
context,
"LMCAS.substitute",
"substitute",
69 const std::vector<Binding>& replacements,
71 return assumed_transform(expression,
context,
"LMCAS.substitute",
"substitute",
75 const auto symbol = std::dynamic_pointer_cast<const VariableNode>(
77 if (!symbol || symbol->is_constant() || !
replacement.value ||
91 const auto include = [&](
const SymbolicExpr& expression) {
94 names.merge(variables);
96 for (
const auto& scope : assumptions.scope_stack_) {
98 if (!access) {
throw access.error(); }
99 for (
auto& symbol : scope.properties.get_all_symbols()) {
101 if (!access) {
throw access.error(); }
102 for (
const auto& [
variable, period] : scope.properties.get_period_decls(symbol)) {
106 for (
const auto& declaration : scope.properties.get_monotonicity_decls(symbol)) {
108 if (!access) {
throw access.error(); }
109 names.insert(declaration.variable);
111 names.insert(std::move(symbol));
113 for (
const auto&
relation : scope.relations.get_relations()) {
117 for (
const auto& conditional : scope.conditionals) {
118 include(conditional.condition);
119 include(conditional.conclusion);
126 auto access =
context.consume_steps(0,
"facts.assumptions");
133 auto access =
context.consume_steps(0,
"facts.assumptions");
140 auto access =
context.consume_steps(0,
"facts.assumptions");
147 auto access =
context.consume_steps(0,
"facts.assumptions");
154 auto access =
context.consume_steps(0,
"facts.assumptions");
AssumptionContext class with scoped push/pop management.
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< Tribool > is_nonnegative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_real(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_nonzero(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_positive(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const override
const InferenceEngine * engine_
static void collect_names(const AssumptionContext &assumptions, std::set< std::string > &names, RewriteBudget &budget)
ComputationContext & context() const noexcept
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
ExpressionResult assumed_transform(const ExprPtr &expression, ComputationContext &context, const char *operation, const char *name, Transform &&transform)
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)
ExpressionResult substitute_expression(const ExprPtr &expression, const std::string &variable, const ExprPtr &replacement, ComputationContext &context)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExpressionResult simplify_expression(const ExprPtr &expression, ComputationContext &context)
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
std::shared_ptr< const SymbolicNode > SymbolicNodePtr
const FactsQuery & no_facts() noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
RewriteBudget const FactsQuery & facts
ComputationContext const std::string & operation
ExpressionResult expand_expression(const ExprPtr &expression, ComputationContext &context)
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)
ExpressionResult differentiate_expression(const ExprPtr &expression, const std::string &variable, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
std::set< std::string > free_variables(const detail::SymbolicNodePtr &expression, detail::RewriteBudget *budget)
std::shared_ptr< SymbolicExpr > ExprPtr
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
const std::string const ExprPtr & value
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name