15 if (matrix.
rows == 0 || matrix.
cols == 0) {
18 "exact matrix dimensions must be non-zero",
operation);
20 if (matrix.
rows > std::numeric_limits<std::size_t>::max() / matrix.
cols ||
24 "exact matrix storage does not match its dimensions",
operation);
26 for (
const auto& entry : matrix.
entries) {
27 if (!entry || !
node(entry)) {
30 "exact matrix entries cannot be null",
operation);
37 if (!expression || !
node(expression)) {
46 (
context).limits().max_ast_nodes,
"transform");
51 return simplified ? simplified : expression;
60 SymbolicExpr::number(-1), expression),
context);
76 if (first == second) {
79 for (std::size_t column = 0; column < matrix.
cols; ++column) {
80 std::swap(matrix.
at(first, column), matrix.
at(second, column));
86 std::size_t first_row,
90 bool saw_unknown =
false;
91 for (std::size_t row = first_row; row < matrix.
rows; ++row) {
104 "exact pivot is not provably zero or non-zero",
operation);
110using namespace matrix_kernel;
114 std::dynamic_pointer_cast<const PowerNode>(
node(simplified))) {
120 if (*base > Rational(0)) {
123 if (*base == Rational(0) && *
exponent > Rational(0)) {
133 std::dynamic_pointer_cast<const FunctionNode>(
node(simplified));
138 function->arguments().size() != 1) {
143 if (!argument || *argument < Rational(0)) {
159 if (
auto root = std::dynamic_pointer_cast<const RootOfNode>(
node(expression));
160 root && !root->exact_id().polynomial.coeffs.empty() &&
161 root->exact_id().polynomial.coeffs[0] != Rational(0)) {
176 if (!expression || !
node(expression)) {
179 "zero classification requires an expression",
operation);
183 if (
auto proof = classify_numeric_value(simplified)) {
189 auto assumption =
context.assumptions()->is_nonzero_checked(*simplified,
context);
202 }
catch (
const std::length_error& error) {
204 }
catch (
const std::bad_alloc&) {
207 "zero classification allocation failed",
operation);
208 }
catch (
const std::exception& error) {
AssumptionContext class with scoped push/pop management.
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::optional< ZeroProof > classify_numeric_power(const ExprPtr &simplified)
std::optional< ZeroProof > classify_numeric_value(const ExprPtr &expression)
std::optional< ZeroProof > classify_numeric_sqrt(const ExprPtr &simplified)
ExprPtr simplify_expr(ExprPtr expression, ComputationContext &context)
std::optional< Rational > exact_rational(const ExprPtr &expression)
Result< std::optional< std::size_t > > choose_pivot(const ExactMatrixData &matrix, std::size_t first_row, std::size_t column, ComputationContext &context, const std::string &operation)
ExprPtr exact_multiply(const ExprPtr &left, const ExprPtr &right, ComputationContext &context)
ExprPtr exact_subtract(const ExprPtr &left, const ExprPtr &right, ComputationContext &context)
ExprPtr exact_negate(const ExprPtr &expression, ComputationContext &context)
void swap_rows(ExactMatrixData &matrix, std::size_t first, std::size_t second)
Result< void > validate_matrix(const ExactMatrixData &matrix, const std::string &operation)
ExprPtr exact_add(const ExprPtr &left, const ExprPtr &right, ComputationContext &context)
ExprPtr exact_divide(const ExprPtr &numerator, const ExprPtr &denominator, ComputationContext &context)
Result< ZeroProof > classify_exact_zero(const ExprPtr &expression, ComputationContext &context, const std::string &operation)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ComputationContext const std::string & operation
std::optional< Rational > exact_rational_value(const NumberNode &number)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::size_t std::size_t ComputationContext & context
@ True
Property definitely holds
@ False
Property definitely does not hold
std::shared_ptr< SymbolicExpr > ExprPtr
const std::string const ExprPtr & value
const ExprPtr & denominator
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
const ExprPtr & at(std::size_t row, std::size_t col) const
std::vector< ExprPtr > entries