diff --git a/coverage/main/badges/flat.svg b/coverage/main/badges/flat.svg
index a8ad79892..c844e4c03 100644
--- a/coverage/main/badges/flat.svg
+++ b/coverage/main/badges/flat.svg
@@ -1,23 +1,23 @@
- coverage: 74%
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="20" role="img" aria-label="coverage: 9%">
+ coverage: 9%
-
+
-
-
+
+
coverage
coverage
- 74%
- 74%
+ 9%
+ 9%
\ No newline at end of file
diff --git a/coverage/main/badges/flat_square.svg b/coverage/main/badges/flat_square.svg
index fb34f5594..20b9b9651 100644
--- a/coverage/main/badges/flat_square.svg
+++ b/coverage/main/badges/flat_square.svg
@@ -1,13 +1,13 @@
- coverage: 74%
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="20" role="img" aria-label="coverage: 9%">
+ coverage: 9%
-
+
coverage
- 74%
+ 9%
\ No newline at end of file
diff --git a/coverage/main/badges/for_the_badge.svg b/coverage/main/badges/for_the_badge.svg
index 72da28008..1a7774cd4 100644
--- a/coverage/main/badges/for_the_badge.svg
+++ b/coverage/main/badges/for_the_badge.svg
@@ -1,13 +1,13 @@
- COVERAGE: 74%
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="133" height="28" role="img" aria-label="COVERAGE: 9%">
+ COVERAGE: 9%
-
+
COVERAGE
- 74%
+ 9%
\ No newline at end of file
diff --git a/coverage/main/badges/plastic.svg b/coverage/main/badges/plastic.svg
index b548872fe..384ae2519 100644
--- a/coverage/main/badges/plastic.svg
+++ b/coverage/main/badges/plastic.svg
@@ -1,6 +1,6 @@
- coverage: 74%
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="18" role="img" aria-label="coverage: 9%">
+ coverage: 9%
@@ -8,18 +8,18 @@
-
+
-
-
+
+
coverage
coverage
- 74%
- 74%
+ 9%
+ 9%
\ No newline at end of file
diff --git a/coverage/main/badges/social.svg b/coverage/main/badges/social.svg
index f061a944b..cd39fc429 100644
--- a/coverage/main/badges/social.svg
+++ b/coverage/main/badges/social.svg
@@ -1,6 +1,6 @@
- Coverage: 74%
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="93" height="20" role="img" aria-label="Coverage: 9%">
+ Coverage: 9%
@@ -12,7 +12,7 @@
-
+
@@ -20,8 +20,8 @@
Coverage
Coverage
- 74%
- 74%
+ 9%
+ 9%
\ No newline at end of file
diff --git a/coverage/main/conjure_oxide/src/find_conjure.rs.html b/coverage/main/conjure_oxide/src/find_conjure.rs.html
index eeee0a6ee..87fb17f5a 100644
--- a/coverage/main/conjure_oxide/src/find_conjure.rs.html
+++ b/coverage/main/conjure_oxide/src/find_conjure.rs.html
@@ -15,7 +15,7 @@
@@ -23,7 +23,7 @@
Functions
- 16.67 %
+
0 %
@@ -166,13 +166,13 @@
9
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn conjure_executable() -> Result<()> {
+
pub fn conjure_executable() -> Result<()> {
10
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut cmd = std::process::Command::new("conjure");
+
let mut cmd = std::process::Command::new("conjure");
11
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let output = cmd.arg("--version").output()?;
+
let output = cmd.arg("--version").output()?;
12
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let stdout = String::from_utf8(output.stdout)?;
+
let stdout = String::from_utf8(output.stdout)?;
13
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let stderr = String::from_utf8(output.stderr)?;
+
let stderr = String::from_utf8(output.stderr)?;
15
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if !stderr.is_empty() {
+
if !stderr.is_empty() {
17
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
18
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let first = stdout
+
let first = stdout
19
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
20
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
21
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.ok_or(anyhow!("Could not read stdout"))?;
+
.ok_or(anyhow!("Could not read stdout"))?;
22
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if first != CORRECT_FIRST_LINE {
+
if first != CORRECT_FIRST_LINE {
34
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
35
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let version_line = stdout
+
let version_line = stdout
36
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
37
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
38
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.ok_or(anyhow!("Could not read Conjure's stdout"))?;
+
.ok_or(anyhow!("Could not read Conjure's stdout"))?;
40
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let version = match version_line.strip_prefix("Release version ") {
+
let version = match version_line.strip_prefix("Release version ") {
41
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Some(v) => Ok(v),
+
Some(v) => Ok(v),
55
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if Versioning::new(version) < Versioning::new(CONJURE_MIN_VERSION) {
+
if Versioning::new(version) < Versioning::new(CONJURE_MIN_VERSION) {
61
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
62
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
63
- 5
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
use std::collections::HashMap;
-
-
-
-
-
-
-
-
use std::process::exit;
-
-
-
-
-
-
-
-
use conjure_core::rules::eval_constant;
-
-
-
-
-
-
-
-
use conjure_core::solver::SolverFamily;
-
-
-
-
-
-
-
-
get_rule_by_name, get_rules,
-
-
-
-
-
-
-
-
rule_engine::{resolve_rule_sets, rewrite_model},
-
-
-
-
-
-
-
-
solver::{adaptors, Solver},
-
-
-
-
-
-
-
-
utils::testing::save_stats_json,
-
-
-
-
-
-
-
-
Metadata, Model, Rule,
-
-
-
-
-
-
-
-
use uniplate::uniplate::Uniplate;
-
-
-
-
- 1
-
-
-
let rules = get_rules();
-
-
-
-
- 1
-
-
-
assert!(!rules.is_empty());
-
-
-
-
- 1
-
-
-
fn sum_of_constants() {
-
-
-
-
- 1
-
-
-
let valid_sum_expression = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(3)),
-
-
-
-
- 1
-
-
-
let invalid_sum_expression = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
match evaluate_sum_of_constants(&valid_sum_expression) {
-
-
-
-
- 1
-
-
-
Some(result) => assert_eq!(result, 6),
-
-
-
-
- 1
-
-
-
if evaluate_sum_of_constants(&invalid_sum_expression).is_some() {
-
-
-
-
- 4
-
-
-
fn evaluate_sum_of_constants(expr: &Expression) -> Option<i32> {
-
-
-
-
- 4
-
-
-
Expression::Sum(_metadata, expressions) => {
-
-
-
-
- 12
-
-
-
for e in expressions {
-
-
-
-
- 8
-
-
-
Expression::Constant(_, Constant::Int(value)) => {
-
-
-
-
- 1
-
-
-
fn recursive_sum_of_constants() {
-
-
-
-
- 1
-
-
-
let complex_expression = Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(3))),
-
-
-
-
- 1
-
-
-
let correct_simplified_expression = Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(3)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(3))),
-
-
-
-
- 1
-
-
-
let simplified_expression = simplify_expression(complex_expression.clone());
-
-
-
-
- 1
-
-
-
assert_eq!(simplified_expression, correct_simplified_expression);
-
-
-
-
- 7
-
-
-
fn simplify_expression(expr: Expression) -> Expression {
-
-
-
-
- 2
-
-
-
Expression::Sum(_metadata, expressions) => {
-
-
-
-
- 1
-
-
-
if let Some(result) =
-
-
-
-
- 2
-
-
-
evaluate_sum_of_constants(&Expression::Sum(Metadata::new(), expressions.clone()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(result))
-
-
-
-
- 1
-
-
-
expressions.into_iter().map(simplify_expression).collect(),
-
-
-
-
- 1
-
-
-
Expression::Eq(_metadata, left, right) => Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(simplify_expression(*left)),
-
-
-
-
- 1
-
-
-
Box::new(simplify_expression(*right)),
-
-
-
-
-
-
-
-
Expression::Geq(_metadata, left, right) => Expression::Geq(
-
-
-
-
-
-
-
-
Box::new(simplify_expression(*left)),
-
-
-
-
-
-
-
-
Box::new(simplify_expression(*right)),
-
-
-
-
- 1
-
-
-
fn rule_sum_constants() {
-
-
-
-
- 1
-
-
-
let sum_constants = get_rule_by_name("sum_constants").unwrap();
-
-
-
-
- 1
-
-
-
let unwrap_sum = get_rule_by_name("unwrap_sum").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(3)),
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(6))
-
-
-
-
- 1
-
-
-
fn rule_sum_mixed() {
-
-
-
-
- 1
-
-
-
let sum_constants = get_rule_by_name("sum_constants").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(3)),
-
-
-
-
- 1
-
-
-
let flatten_sum_geq = get_rule_by_name("flatten_sum_geq").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Geq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(3))),
-
-
-
-
- 1
-
-
-
expr = flatten_sum_geq
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(3)))
-
-
-
-
-
-
-
-
/// Reduce and solve:
-
-
-
-
-
-
-
-
/// find a,b,c : int(1..3)
-
-
-
-
-
-
-
-
/// such that a + b + c <= 2 + 3 - 1
-
-
-
-
- 1
-
-
-
fn reduce_solve_xyz() {
-
-
-
-
- 1
-
-
-
println!("Rules: {:?}", get_rules());
-
-
-
-
- 1
-
-
-
let sum_constants = get_rule_by_name("sum_constants").unwrap();
-
-
-
-
- 1
-
-
-
let unwrap_sum = get_rule_by_name("unwrap_sum").unwrap();
-
-
-
-
- 1
-
-
-
let lt_to_ineq = get_rule_by_name("lt_to_ineq").unwrap();
-
-
-
-
- 1
-
-
-
let sum_leq_to_sumleq = get_rule_by_name("sum_leq_to_sumleq").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr1 = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(2)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(3)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(-1)),
-
-
-
-
- 1
-
-
-
expr1 = sum_constants
-
-
-
-
- 1
-
-
-
.apply(&expr1, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
.apply(&expr1, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(4))
-
-
-
-
- 1
-
-
-
expr1 = Expression::Leq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("c"))),
-
-
-
-
- 1
-
-
-
expr1 = sum_leq_to_sumleq
-
-
-
-
- 1
-
-
-
.apply(&expr1, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("c"))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(4)))
-
-
-
-
- 1
-
-
-
let mut expr2 = Expression::Lt(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a")),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("b")),
-
-
-
-
- 1
-
-
-
.apply(&expr2, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a"))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("b"))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(-1)))
-
-
-
-
- 1
-
-
-
let mut model = Model::new(
-
-
-
-
- 1
-
-
-
Expression::And(Metadata::new(), vec![expr1, expr2]),
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a")),
-
-
-
-
- 1
-
-
-
domain: Domain::IntDomain(vec![Range::Bounded(1, 3)]),
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("b")),
-
-
-
-
- 1
-
-
-
domain: Domain::IntDomain(vec![Range::Bounded(1, 3)]),
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("c")),
-
-
-
-
- 1
-
-
-
domain: Domain::IntDomain(vec![Range::Bounded(1, 3)]),
-
-
-
-
- 1
-
-
-
let solver: Solver<adaptors::Minion> = Solver::new(adaptors::Minion::new());
-
-
-
-
- 1
-
-
-
let solver = solver.load_model(model).unwrap();
-
-
-
-
- 1
-
-
-
solver.solve(Box::new(|_| true)).unwrap();
-
-
-
-
- 1
-
-
-
fn rule_remove_double_negation() {
-
-
-
-
- 1
-
-
-
let remove_double_negation = get_rule_by_name("remove_double_negation").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Bool(true))),
-
-
-
-
- 1
-
-
-
expr = remove_double_negation
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true))
-
-
-
-
- 1
-
-
-
fn rule_unwrap_nested_or() {
-
-
-
-
- 1
-
-
-
let unwrap_nested_or = get_rule_by_name("unwrap_nested_or").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
expr = unwrap_nested_or
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
fn rule_unwrap_nested_and() {
-
-
-
-
- 1
-
-
-
let unwrap_nested_and = get_rule_by_name("unwrap_nested_and").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
expr = unwrap_nested_and
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
fn unwrap_nested_or_not_changed() {
-
-
-
-
- 1
-
-
-
let unwrap_nested_or = get_rule_by_name("unwrap_nested_or").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
let result = unwrap_nested_or.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn unwrap_nested_and_not_changed() {
-
-
-
-
- 1
-
-
-
let unwrap_nested_and = get_rule_by_name("unwrap_nested_and").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
let result = unwrap_nested_and.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn remove_trivial_and_or() {
-
-
-
-
- 1
-
-
-
let remove_trivial_and = get_rule_by_name("remove_trivial_and").unwrap();
-
-
-
-
- 1
-
-
-
let remove_trivial_or = get_rule_by_name("remove_trivial_or").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr_and = Expression::And(
-
-
-
-
- 1
-
-
-
vec![Expression::Constant(Metadata::new(), Constant::Bool(true))],
-
-
-
-
- 1
-
-
-
let mut expr_or = Expression::Or(
-
-
-
-
- 1
-
-
-
vec![Expression::Constant(Metadata::new(), Constant::Bool(false))],
-
-
-
-
- 1
-
-
-
expr_and = remove_trivial_and
-
-
-
-
- 1
-
-
-
.apply(&expr_and, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
expr_or = remove_trivial_or
-
-
-
-
- 1
-
-
-
.apply(&expr_or, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false))
-
-
-
-
- 1
-
-
-
fn rule_remove_constants_from_or() {
-
-
-
-
- 1
-
-
-
let remove_constants_from_or = get_rule_by_name("remove_constants_from_or").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
expr = remove_constants_from_or
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true))
-
-
-
-
- 1
-
-
-
fn rule_remove_constants_from_and() {
-
-
-
-
- 1
-
-
-
let remove_constants_from_and = get_rule_by_name("remove_constants_from_and").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
expr = remove_constants_from_and
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false))
-
-
-
-
- 1
-
-
-
fn remove_constants_from_or_not_changed() {
-
-
-
-
- 1
-
-
-
let remove_constants_from_or = get_rule_by_name("remove_constants_from_or").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
let result = remove_constants_from_or.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn remove_constants_from_and_not_changed() {
-
-
-
-
- 1
-
-
-
let remove_constants_from_and = get_rule_by_name("remove_constants_from_and").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
let result = remove_constants_from_and.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn rule_distribute_not_over_and() {
-
-
-
-
- 1
-
-
-
let distribute_not_over_and = get_rule_by_name("distribute_not_over_and").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
expr = distribute_not_over_and
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a"))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("b"))
-
-
-
-
- 1
-
-
-
fn rule_distribute_not_over_or() {
-
-
-
-
- 1
-
-
-
let distribute_not_over_or = get_rule_by_name("distribute_not_over_or").unwrap();
-
-
-
-
- 1
-
-
-
let mut expr = Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("b"))),
-
-
-
-
- 1
-
-
-
expr = distribute_not_over_or
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a"))
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("b"))
-
-
-
-
- 1
-
-
-
fn rule_distribute_not_over_and_not_changed() {
-
-
-
-
- 1
-
-
-
let distribute_not_over_and = get_rule_by_name("distribute_not_over_and").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a")),
-
-
-
-
- 1
-
-
-
let result = distribute_not_over_and.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn rule_distribute_not_over_or_not_changed() {
-
-
-
-
- 1
-
-
-
let distribute_not_over_or = get_rule_by_name("distribute_not_over_or").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::Not(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("a")),
-
-
-
-
- 1
-
-
-
let result = distribute_not_over_or.apply(&expr, &Model::new_empty(Default::default()));
-
-
-
-
- 1
-
-
-
assert!(result.is_err());
-
-
-
-
- 1
-
-
-
fn rule_distribute_or_over_and() {
-
-
-
-
- 1
-
-
-
let distribute_or_over_and = get_rule_by_name("distribute_or_over_and").unwrap();
-
-
-
-
- 1
-
-
-
let expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(1)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(2)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(3)),
-
-
-
-
- 1
-
-
-
let red = distribute_or_over_and
-
-
-
-
- 1
-
-
-
.apply(&expr, &Model::new_empty(Default::default()))
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(3)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(1)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(3)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::MachineName(2)),
-
-
-
-
-
-
-
-
// fn rule_ensure_div() {
-
-
-
-
-
-
-
-
// let ensure_div = get_rule_by_name("ensure_div").unwrap();
-
-
-
-
-
-
-
-
// let expr = Expression::Div(
-
-
-
-
-
-
-
-
// Box::new(Expression::Reference(
-
-
-
-
-
-
-
-
// Name::UserName("a".to_string()),
-
-
-
-
-
-
-
-
// Box::new(Expression::Reference(
-
-
-
-
-
-
-
-
// Name::UserName("b".to_string()),
-
-
-
-
-
-
-
-
// let red = ensure_div.apply(&expr, &Model::new_empty(Default::default())).unwrap();
-
-
-
-
-
-
-
-
// red.new_expression,
-
-
-
-
-
-
-
-
// Expression::SafeDiv(
-
-
-
-
-
-
-
-
// Box::new(Expression::Reference(
-
-
-
-
-
-
-
-
// Name::UserName("a".to_string())
-
-
-
-
-
-
-
-
// Box::new(Expression::Reference(
-
-
-
-
-
-
-
-
// Name::UserName("b".to_string())
-
-
-
-
-
-
-
-
// Box::new(Expression::Reference(
-
-
-
-
-
-
-
-
// Name::UserName("b".to_string())
-
-
-
-
-
-
-
-
// Box::new(Expression::Constant(Metadata::new(), Constant::Int(0)))
-
-
-
-
-
-
-
-
/// Reduce and solve:
-
-
-
-
-
-
-
-
/// find a,b,c : int(1..3)
-
-
-
-
-
-
-
-
/// such that a + b + c = 4
-
-
-
-
-
-
-
-
/// This test uses the rewrite function to simplify the expression instead
-
-
-
-
-
-
-
-
/// of applying the rules manually.
-
-
-
-
- 1
-
-
-
fn rewrite_solve_xyz() {
-
-
-
-
- 1
-
-
-
println!("Rules: {:?}", get_rules());
-
-
-
-
- 1
-
-
-
let rule_sets = match resolve_rule_sets(SolverFamily::Minion, &vec!["Constant".to_string()]) {
-
-
-
-
-
-
-
-
eprintln!("Error resolving rule sets: {}", e);
-
-
-
-
- 1
-
-
-
println!("Rule sets: {:?}", rule_sets);
-
-
-
-
- 1
-
-
-
// Create variables and domains
-
-
-
-
- 1
-
-
-
let variable_a = Name::UserName(String::from("a"));
-
-
-
-
- 1
-
-
-
let variable_b = Name::UserName(String::from("b"));
-
-
-
-
- 1
-
-
-
let variable_c = Name::UserName(String::from("c"));
-
-
-
-
- 1
-
-
-
let domain = Domain::IntDomain(vec![Range::Bounded(1, 3)]);
-
-
-
-
- 1
-
-
-
// Construct nested expression
-
-
-
-
- 1
-
-
-
let nested_expr = Expression::And(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), variable_a.clone()),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), variable_b.clone()),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), variable_c.clone()),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(4))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(Metadata::new(), variable_a.clone())),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(Metadata::new(), variable_b.clone())),
-
-
-
-
- 1
-
-
-
let rule_sets = match resolve_rule_sets(SolverFamily::Minion, &vec!["Constant".to_string()]) {
-
-
-
-
-
-
-
-
eprintln!("Error resolving rule sets: {}", e);
-
-
-
-
-
-
-
-
// Apply rewrite function to the nested expression
-
-
-
-
- 1
-
-
-
let rewritten_expr = rewrite_model(
-
-
-
-
- 1
-
-
-
&Model::new(HashMap::new(), nested_expr, Default::default()),
-
-
-
-
- 1
-
-
-
// Check if the expression is in its simplest form
-
-
-
-
- 1
-
-
-
let expr = rewritten_expr.clone();
-
-
-
-
- 1
-
-
-
assert!(is_simple(&expr));
-
-
-
-
-
-
-
-
// Create model with variables and constraints
-
-
-
-
- 1
-
-
-
let mut model = Model::new(HashMap::new(), rewritten_expr, Default::default());
-
-
-
-
- 1
-
-
-
// Insert variables and domains
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
domain: domain.clone(),
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
domain: domain.clone(),
-
-
-
-
- 1
-
-
-
model.variables.insert(
-
-
-
-
- 1
-
-
-
domain: domain.clone(),
-
-
-
-
- 1
-
-
-
let solver: Solver<adaptors::Minion> = Solver::new(adaptors::Minion::new());
-
-
-
-
- 1
-
-
-
let solver = solver.load_model(model).unwrap();
-
-
-
-
- 1
-
-
-
solver.solve(Box::new(|_| true)).unwrap();
-
-
-
-
- 1
-
-
-
fn rewrite_solve_xyz_parameterized() {
-
-
-
-
- 1
-
-
-
println!("Rules: {:?}", get_rules());
-
-
-
-
- 1
-
-
-
let rule_sets = match resolve_rule_sets(SolverFamily::Minion, &vec!["Constant".to_string()]) {
-
-
-
-
-
-
-
-
eprintln!("Error resolving rule sets: {}", e);
-
-
-
-
- 1
-
-
-
println!("Rule sets: {:?}", rule_sets);
-
-
-
-
- 1
-
-
-
// Create variables and domain
-
-
-
-
- 1
-
-
-
let variable_a = Name::UserName(String::from("a"));
-
-
-
-
- 1
-
-
-
let variable_b = Name::UserName(String::from("b"));
-
-
-
-
- 1
-
-
-
let variable_c = Name::UserName(String::from("c"));
-
-
-
-
- 1
-
-
-
let domain = Domain::IntDomain(vec![Range::Bounded(1, 3)]);
-
-
-
-
- 1
-
-
-
// Create a vector of test cases with varying number of OR clauses
-
-
-
-
- 1
-
-
-
let test_cases = vec![1, 2, 3, 4];
-
-
-
-
- 5
-
-
-
for num_or_clauses in test_cases {
-
-
-
-
-
-
-
-
// Construct OR'd expression
-
-
-
-
- 4
-
-
-
let mut or_exprs = Vec::new();
-
-
-
-
- 10
-
-
-
for _i in 0..num_or_clauses {
-
-
-
-
- 10
-
-
-
let expr = Expression::And(
-
-
-
-
- 10
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 10
-
-
-
Expression::Reference(Metadata::new(), variable_a.clone()),
-
-
-
-
- 10
-
-
-
Expression::Reference(Metadata::new(), variable_b.clone()),
-
-
-
-
- 10
-
-
-
Expression::Reference(Metadata::new(), variable_c.clone()),
-
-
-
-
- 10
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(4))),
-
-
-
-
- 10
-
-
-
Box::new(Expression::Reference(Metadata::new(), variable_a.clone())),
-
-
-
-
- 10
-
-
-
Box::new(Expression::Reference(Metadata::new(), variable_b.clone())),
-
-
-
-
- 4
-
-
-
let nested_expr = Expression::Or(Metadata::new(), or_exprs);
-
-
-
-
- 4
-
-
-
let model_for_rewrite = Model::new(HashMap::new(), nested_expr.clone(), Default::default());
-
-
-
-
- 4
-
-
-
let model_for_rewrite_unoptimized =
-
-
-
-
- 4
-
-
-
Model::new(HashMap::new(), nested_expr.clone(), Default::default());
-
-
-
-
- 4
-
-
-
// Apply rewrite function to the nested expression
-
-
-
-
- 4
-
-
-
let rewritten_expr = rewrite_model(&model_for_rewrite, &rule_sets)
-
-
-
-
- 4
-
-
-
env::set_var("OPTIMIZATIONS", "0");
-
-
-
-
- 4
-
-
-
let rewritten_expr_unoptimized = rewrite_model(&model_for_rewrite_unoptimized, &rule_sets)
-
-
-
-
- 4
-
-
-
env::remove_var("OPTIMIZATIONS");
-
-
-
-
- 4
-
-
-
let info_file_name_optimized = format!("rewrite_solve_xyz_optimized_{}", num_or_clauses);
-
-
-
-
- 4
-
-
-
let info_file_name_unoptimized =
-
-
-
-
- 4
-
-
-
format!("rewrite_solve_xyz_unoptimized_{}", num_or_clauses);
-
-
-
-
- 4
-
-
-
model_for_rewrite.context,
-
-
-
-
- 4
-
-
-
&info_file_name_optimized,
-
-
-
-
- 4
-
-
-
.expect("Could not save stats!");
-
-
-
-
- 4
-
-
-
model_for_rewrite_unoptimized.context,
-
-
-
-
- 4
-
-
-
&info_file_name_unoptimized,
-
-
-
-
- 4
-
-
-
.expect("Could not save stats!");
-
-
-
-
- 4
-
-
-
// Check if the expression is in its simplest form
-
-
-
-
- 4
-
-
-
let expr = rewritten_expr.clone();
-
-
-
-
- 4
-
-
-
assert!(is_simple(&expr));
-
-
-
-
- 4
-
-
-
let expr_unoptimized = rewritten_expr_unoptimized.clone();
-
-
-
-
- 4
-
-
-
assert!(is_simple(&expr_unoptimized));
-
-
-
-
-
-
-
-
// Create model with variables and constraints
-
-
-
-
- 4
-
-
-
let mut model = Model::new(HashMap::new(), rewritten_expr, Default::default());
-
-
-
-
- 4
-
-
-
let mut model_unoptimized = Model::new(
-
-
-
-
- 4
-
-
-
rewritten_expr_unoptimized,
-
-
-
-
- 4
-
-
-
// Insert variables and domains
-
-
-
-
- 4
-
-
-
model.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
model.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
model.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
model_unoptimized.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
model_unoptimized.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
model_unoptimized.variables.insert(
-
-
-
-
- 4
-
-
-
domain: domain.clone(),
-
-
-
-
- 4
-
-
-
let solver: Solver<adaptors::Minion> = Solver::new(adaptors::Minion::new());
-
-
-
-
- 4
-
-
-
let solver = solver.load_model(model).unwrap();
-
-
-
-
- 4
-
-
-
solver.solve(Box::new(|_| true)).unwrap();
-
-
-
-
- 4
-
-
-
let solver_unoptimized: Solver<adaptors::Minion> = Solver::new(adaptors::Minion::new());
-
-
-
-
- 4
-
-
-
let solver_unoptimized = solver_unoptimized.load_model(model_unoptimized).unwrap();
-
-
-
-
- 4
-
-
-
solver_unoptimized.solve(Box::new(|_| true)).unwrap();
-
-
-
-
-
-
-
-
struct RuleResult<'a> {
-
-
-
-
-
-
-
-
new_expression: Expression,
-
-
-
-
-
-
-
-
/// - True if `expression` is in its simplest form.
-
-
-
-
-
-
-
-
/// - False otherwise.
-
-
-
-
- 9
-
-
-
pub fn is_simple(expression: &Expression) -> bool {
-
-
-
-
- 9
-
-
-
let rules = get_rules();
-
-
-
-
- 9
-
-
-
let mut new = expression.clone();
-
-
-
-
- 9
-
-
-
while let Some(step) = is_simple_iteration(&new, &rules) {
-
-
-
-
-
-
-
-
/// - Some(<new_expression>) after applying the first applicable rule to `expr` or a sub-expression.
-
-
-
-
-
-
-
-
/// - None if no rule is applicable to the expression or any sub-expression.
-
-
-
-
- 4233
-
-
-
fn is_simple_iteration<'a>(
-
-
-
-
- 4233
-
-
-
expression: &'a Expression,
-
-
-
-
- 4233
-
-
-
rules: &'a Vec<&'a Rule<'a>>,
-
-
-
-
- 4233
-
-
-
) -> Option<Expression> {
-
-
-
-
- 4233
-
-
-
let rule_results = apply_all_rules(expression, rules);
-
-
-
-
- 4233
-
-
-
if let Some(new) = choose_rewrite(&rule_results) {
-
-
-
-
- 4233
-
-
-
let mut sub = expression.children();
-
-
-
-
- 4233
-
-
-
for i in 0..sub.len() {
-
-
-
-
- 4224
-
-
-
if let Some(new) = is_simple_iteration(&sub[i], rules) {
-
-
-
-
-
-
-
-
if let Ok(res) = expression.with_children(sub.clone()) {
-
-
-
-
- 4233
-
-
-
None // No rules applicable to this branch of the expression
-
-
-
-
-
-
-
-
/// - A list of RuleResults after applying all rules to `expression`.
-
-
-
-
-
-
-
-
/// - An empty list if no rules are applicable.
-
-
-
-
- 4233
-
-
-
fn apply_all_rules<'a>(
-
-
-
-
- 4233
-
-
-
expression: &'a Expression,
-
-
-
-
- 4233
-
-
-
rules: &'a Vec<&'a Rule<'a>>,
-
-
-
-
- 4233
-
-
-
) -> Vec<RuleResult<'a>> {
-
-
-
-
- 4233
-
-
-
let mut results = Vec::new();
-
-
-
-
- 139689
-
-
-
match rule.apply(expression, &Model::new_empty(Default::default())) {
-
-
-
-
-
-
-
-
results.push(RuleResult {
-
-
-
-
-
-
-
-
new_expression: red.new_expression,
-
-
-
-
-
-
-
-
/// - Some(<new_expression>) after applying the first rule in `results`.
-
-
-
-
-
-
-
-
/// - None if `results` is empty.
-
-
-
-
- 4233
-
-
-
fn choose_rewrite(results: &[RuleResult]) -> Option<Expression> {
-
-
-
-
- 4233
-
-
-
if results.is_empty() {
-
-
-
-
-
-
-
-
// Return the first result for now
-
-
-
-
-
-
-
-
// println!("Applying rule: {:?}", results[0].rule);
-
-
-
-
-
-
-
-
Some(results[0].new_expression.clone())
-
-
-
-
- 1
-
-
-
fn eval_const_int() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Constant(Metadata::new(), Constant::Int(1));
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Int(1)));
-
-
-
-
- 1
-
-
-
fn eval_const_bool() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Constant(Metadata::new(), Constant::Bool(true));
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Bool(true)));
-
-
-
-
- 1
-
-
-
fn eval_const_and() {
-
-
-
-
- 1
-
-
-
let expr = Expression::And(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Bool(false)));
-
-
-
-
- 1
-
-
-
fn eval_const_ref() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Reference(Metadata::new(), Name::UserName(String::from("a")));
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, None);
-
-
-
-
- 1
-
-
-
fn eval_const_nested_ref() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("a"))),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, None);
-
-
-
-
- 1
-
-
-
fn eval_const_eq_int() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(1))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(1))),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Bool(true)));
-
-
-
-
- 1
-
-
-
fn eval_const_eq_bool() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Bool(true))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Bool(true))),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Bool(true)));
-
-
-
-
- 1
-
-
-
fn eval_const_eq_mixed() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Eq(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(1))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Bool(true))),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, None);
-
-
-
-
- 1
-
-
-
fn eval_const_sum_mixed() {
-
-
-
-
- 1
-
-
-
let expr = Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Int(1)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(true)),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, None);
-
-
-
-
- 1
-
-
-
fn eval_const_sum_xyz() {
-
-
-
-
- 1
-
-
-
let expr = Expression::And(
-
-
-
-
- 1
-
-
-
Box::new(Expression::Sum(
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("x"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("y"))),
-
-
-
-
- 1
-
-
-
Expression::Reference(Metadata::new(), Name::UserName(String::from("z"))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Constant(Metadata::new(), Constant::Int(4))),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("x")),
-
-
-
-
- 1
-
-
-
Box::new(Expression::Reference(
-
-
-
-
- 1
-
-
-
Name::UserName(String::from("y")),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, None);
-
-
-
-
- 1
-
-
-
let expr = Expression::Or(
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
Expression::Constant(Metadata::new(), Constant::Bool(false)),
-
-
-
-
- 1
-
-
-
let result = eval_constant(&expr);
-
-
-
-
- 1
-
-
-
assert_eq!(result, Some(Constant::Bool(false)));
-
-
-
-
-
diff --git a/coverage/main/conjure_oxide/src/index.html b/coverage/main/conjure_oxide/src/index.html
index 96a6dfcb6..6a5a24916 100644
--- a/coverage/main/conjure_oxide/src/index.html
+++ b/coverage/main/conjure_oxide/src/index.html
@@ -15,7 +15,7 @@
@@ -23,7 +23,7 @@
Functions
- 16.67 %
+
0 %
@@ -46,20 +46,20 @@
- 47.92%
+ 0%
- 47.92%
+ 0%
- 23 / 48
+ 0 / 48
-
16.67%
-
1 / 6
+
0%
+
0 / 4
@@ -67,7 +67,7 @@
diff --git a/coverage/main/conjure_oxide/src/utils/conjure.rs.html b/coverage/main/conjure_oxide/src/utils/conjure.rs.html
index c04310162..68f9af88a 100644
--- a/coverage/main/conjure_oxide/src/utils/conjure.rs.html
+++ b/coverage/main/conjure_oxide/src/utils/conjure.rs.html
@@ -14,8 +14,8 @@
@@ -23,7 +23,7 @@
Functions
- 22.22 %
+
0 %
@@ -502,13 +502,13 @@
30
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn parse_essence_file(
+
pub fn parse_essence_file(
31
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
32
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
filename: &str,
+
filename: &str,
33
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
context: Arc<RwLock<Context<'static>>>,
+
context: Arc<RwLock<Context<'static>>>,
34
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<Model, EssenceParseError> {
+
) -> Result<Model, EssenceParseError> {
35
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut cmd = std::process::Command::new("conjure");
+
let mut cmd = std::process::Command::new("conjure");
36
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let output = match cmd
+
let output = match cmd
37
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.arg("pretty")
+
.arg("pretty")
38
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.arg("--output-format=astjson")
+
.arg("--output-format=astjson")
39
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.arg(format!("{path}/{filename}.essence"))
+
.arg(format!("{path}/{filename}.essence"))
40
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
42
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(output) => output,
+
Ok(output) => output,
46
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if !output.status.success() {
+
if !output.status.success() {
50
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
52
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let astjson = match String::from_utf8(output.stdout) {
+
let astjson = match String::from_utf8(output.stdout) {
53
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(astjson) => astjson,
+
Ok(astjson) => astjson,
62
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let parsed_model = model_from_json(&astjson, context)?;
+
let parsed_model = model_from_json(&astjson, context)?;
63
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(parsed_model)
+
Ok(parsed_model)
64
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
66
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn get_minion_solutions(model: Model) -> Result<Vec<HashMap<Name, Constant>>, anyhow::Error> {
+
pub fn get_minion_solutions(model: Model) -> Result<Vec<HashMap<Name, Constant>>, anyhow::Error> {
67
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let solver = Solver::new(Minion::new());
+
let solver = Solver::new(Minion::new());
68
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
69
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
println!("Building Minion model...");
+
println!("Building Minion model...");
70
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let solver = solver.load_model(model)?;
+
let solver = solver.load_model(model)?;
72
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
println!("Running Minion...");
+
println!("Running Minion...");
73
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
74
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let all_solutions_ref = Arc::new(Mutex::<Vec<HashMap<Name, Constant>>>::new(vec![]));
+
let all_solutions_ref = Arc::new(Mutex::<Vec<HashMap<Name, Constant>>>::new(vec![]));
75
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let all_solutions_ref_2 = all_solutions_ref.clone();
+
let all_solutions_ref_2 = all_solutions_ref.clone();
76
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
#[allow(clippy::unwrap_used)]
+
#[allow(clippy::unwrap_used)]
77
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let solver = solver
+
let solver = solver
78
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.solve(Box::new(move |sols| {
+
.solve(Box::new(move |sols| {
79
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut all_solutions = (*all_solutions_ref_2).lock().unwrap();
+
let mut all_solutions = (*all_solutions_ref_2).lock().unwrap();
80
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
(*all_solutions).push(sols);
+
(*all_solutions).push(sols);
81
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
82
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
83
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.unwrap();
+
.unwrap();
84
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
85
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
solver.save_stats_to_context();
+
solver.save_stats_to_context();
86
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
87
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
#[allow(clippy::unwrap_used)]
+
#[allow(clippy::unwrap_used)]
88
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let sols = (*all_solutions_ref).lock().unwrap();
+
let sols = (*all_solutions_ref).lock().unwrap();
89
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
90
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok((*sols).clone())
+
Ok((*sols).clone())
91
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
93
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn minion_solutions_to_json(solutions: &Vec<HashMap<Name, Constant>>) -> JsonValue {
+
pub fn minion_solutions_to_json(solutions: &Vec<HashMap<Name, Constant>>) -> JsonValue {
94
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut json_solutions = Vec::new();
+
let mut json_solutions = Vec::new();
95
- 725
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
for solution in solutions {
+
for solution in solutions {
96
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut json_solution = Map::new();
+
let mut json_solution = Map::new();
97
- 2980
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
for (var_name, constant) in solution {
+
for (var_name, constant) in solution {
98
- 2325
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let serialized_constant = match constant {
+
let serialized_constant = match constant {
99
- 2325
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Constant::Int(i) => JsonValue::Number((*i).into()),
+
Constant::Int(i) => JsonValue::Number((*i).into()),
102
- 2325
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
json_solution.insert(var_name.to_string(), serialized_constant);
+
json_solution.insert(var_name.to_string(), serialized_constant);
104
- 655
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
json_solutions.push(JsonValue::Object(json_solution));
+
json_solutions.push(JsonValue::Object(json_solution));
106
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let ans = JsonValue::Array(json_solutions);
+
let ans = JsonValue::Array(json_solutions);
107
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
sort_json_object(&ans, true)
+
sort_json_object(&ans, true)
108
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
diff --git a/coverage/main/conjure_oxide/src/utils/index.html b/coverage/main/conjure_oxide/src/utils/index.html
index 7c8ffe1c6..f2551e98d 100644
--- a/coverage/main/conjure_oxide/src/utils/index.html
+++ b/coverage/main/conjure_oxide/src/utils/index.html
@@ -15,7 +15,7 @@
@@ -23,7 +23,7 @@
@@ -45,21 +45,21 @@
- 80%
+ 0%
-
- 80%
+
+ 0%
-
- 56 / 70
+
+ 0 / 70
-
22.22%
-
4 / 18
+
0%
+
0 / 12
@@ -69,21 +69,21 @@
- 80.77%
+ 0%
-
- 80.77%
+
+ 0%
-
- 42 / 52
+
+ 0 / 52
-
33.33%
-
6 / 18
+
0%
+
0 / 12
@@ -107,7 +107,7 @@
0%
-
0 / 3
+
0 / 2
@@ -118,20 +118,20 @@
- 59.35%
+ 0%
- 59.35%
+ 0%
- 73 / 123
+ 0 / 123
-
25%
-
6 / 24
+
0%
+
0 / 16
@@ -139,7 +139,7 @@
diff --git a/coverage/main/conjure_oxide/src/utils/json.rs.html b/coverage/main/conjure_oxide/src/utils/json.rs.html
index 96cd50881..559cb473b 100644
--- a/coverage/main/conjure_oxide/src/utils/json.rs.html
+++ b/coverage/main/conjure_oxide/src/utils/json.rs.html
@@ -14,8 +14,8 @@
Lines
-
- 80.77 %
+
+ 0 %
@@ -23,7 +23,7 @@
Functions
- 33.33 %
+
0 %
@@ -134,13 +134,13 @@
7
- 2870
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
fn json_value_cmp(a: &Value, b: &Value) -> std::cmp::Ordering {
+
fn json_value_cmp(a: &Value, b: &Value) -> std::cmp::Ordering {
8
- 2870
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
match (a, b) {
+
match (a, b) {
17
- 240
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
(Value::Array(a), Value::Array(b)) => {
+
(Value::Array(a), Value::Array(b)) => {
18
- 240
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
for (a, b) in a.iter().zip(b.iter()) {
+
for (a, b) in a.iter().zip(b.iter()) {
19
- 240
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let cmp = json_value_cmp(a, b);
+
let cmp = json_value_cmp(a, b);
20
- 240
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if cmp != std::cmp::Ordering::Equal {
+
if cmp != std::cmp::Ordering::Equal {
21
- 240
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
return cmp;
+
return cmp;
26
- 2630
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
_ => a.to_string().cmp(&b.to_string()),
+
_ => a.to_string().cmp(&b.to_string()),
28
- 2870
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
32
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn sort_json_variables(value: &Value) -> Value {
+
pub fn sort_json_variables(value: &Value) -> Value {
33
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
match value {
+
match value {
34
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Array(vars) => {
+
Value::Array(vars) => {
35
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut vars_sorted = vars.clone();
+
let mut vars_sorted = vars.clone();
36
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
vars_sorted.sort_by(json_value_cmp);
+
vars_sorted.sort_by(json_value_cmp);
37
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Array(vars_sorted)
+
Value::Array(vars_sorted)
41
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
48
- 15540
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn sort_json_object(value: &Value, sort_arrays: bool) -> Value {
+
pub fn sort_json_object(value: &Value, sort_arrays: bool) -> Value {
49
- 15540
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
match value {
+
match value {
50
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Object(obj) => {
+
Value::Object(obj) => {
51
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut ordered: Vec<(String, Value)> = obj
+
let mut ordered: Vec<(String, Value)> = obj
52
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
53
- 10735
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.map(|(k, v)| {
+
.map(|(k, v)| {
54
- 10735
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if k == "variables" {
+
if k == "variables" {
55
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
(k.clone(), sort_json_variables(v))
+
(k.clone(), sort_json_variables(v))
57
- 10595
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
(k.clone(), sort_json_object(v, sort_arrays))
+
(k.clone(), sort_json_object(v, sort_arrays))
59
- 10735
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
60
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.collect();
+
.collect();
61
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
62
- 5720
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
ordered.sort_by(|a, b| a.0.cmp(&b.0));
+
ordered.sort_by(|a, b| a.0.cmp(&b.0));
63
- 5015
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Object(ordered.into_iter().collect())
+
Value::Object(ordered.into_iter().collect())
65
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Array(arr) => {
+
Value::Array(arr) => {
66
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut arr: Vec<Value> = arr
+
let mut arr: Vec<Value> = arr
67
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
68
- 4555
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.map(|val| sort_json_object(val, sort_arrays))
+
.map(|val| sort_json_object(val, sort_arrays))
69
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.collect();
+
.collect();
70
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
71
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if sort_arrays {
+
if sort_arrays {
72
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
arr.sort_by(json_value_cmp);
+
arr.sort_by(json_value_cmp);
73
- 1620
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
75
- 1760
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Value::Array(arr)
+
Value::Array(arr)
77
- 8765
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
_ => value.clone(),
+
_ => value.clone(),
79
- 15540
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
diff --git a/coverage/main/conjure_oxide/src/utils/misc.rs.html b/coverage/main/conjure_oxide/src/utils/misc.rs.html
index 41ce9a654..6705a85fa 100644
--- a/coverage/main/conjure_oxide/src/utils/misc.rs.html
+++ b/coverage/main/conjure_oxide/src/utils/misc.rs.html
@@ -23,7 +23,7 @@
@@ -210,7 +210,7 @@
diff --git a/coverage/main/conjure_oxide/src/utils/testing.rs.html b/coverage/main/conjure_oxide/src/utils/testing.rs.html
index 5beaff5d9..e7532226e 100644
--- a/coverage/main/conjure_oxide/src/utils/testing.rs.html
+++ b/coverage/main/conjure_oxide/src/utils/testing.rs.html
@@ -15,7 +15,7 @@
@@ -23,7 +23,7 @@
@@ -678,13 +678,13 @@
41
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn serialise_model(model: &ConjureModel) -> Result<String, JsonError> {
+
pub fn serialise_model(model: &ConjureModel) -> Result<String, JsonError> {
45
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json = sort_json_object(&serde_json::to_value(model.clone())?, false);
+
let generated_json = sort_json_object(&serde_json::to_value(model.clone())?, false);
48
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json_str = serde_json::to_string_pretty(&generated_json)?;
+
let generated_json_str = serde_json::to_string_pretty(&generated_json)?;
50
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(generated_json_str)
+
Ok(generated_json_str)
51
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
53
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn save_model_json(
+
pub fn save_model_json(
54
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
model: &ConjureModel,
+
model: &ConjureModel,
55
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
56
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_name: &str,
+
test_name: &str,
57
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_stage: &str,
+
test_stage: &str,
58
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
accept: bool,
+
accept: bool,
59
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<(), std::io::Error> {
+
) -> Result<(), std::io::Error> {
60
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json_str = serialise_model(model)?;
+
let generated_json_str = serialise_model(model)?;
62
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
File::create(format!(
+
File::create(format!(
63
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
"{path}/{test_name}.generated-{test_stage}.serialised.json"
+
"{path}/{test_name}.generated-{test_stage}.serialised.json"
64
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
65
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.write_all(generated_json_str.as_bytes())?;
+
.write_all(generated_json_str.as_bytes())?;
67
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if accept {
+
if accept {
72
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
74
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
75
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
77
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn save_stats_json(
+
pub fn save_stats_json(
78
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
context: Arc<RwLock<Context<'static>>>,
+
context: Arc<RwLock<Context<'static>>>,
79
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
80
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_name: &str,
+
test_name: &str,
81
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<(), std::io::Error> {
+
) -> Result<(), std::io::Error> {
82
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
#[allow(clippy::unwrap_used)]
+
#[allow(clippy::unwrap_used)]
83
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let stats = context.read().unwrap().clone();
+
let stats = context.read().unwrap().clone();
84
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json = sort_json_object(&serde_json::to_value(stats)?, false);
+
let generated_json = sort_json_object(&serde_json::to_value(stats)?, false);
87
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json_str = serde_json::to_string_pretty(&generated_json)?;
+
let generated_json_str = serde_json::to_string_pretty(&generated_json)?;
89
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
File::create(format!("{path}/{test_name}-stats.json"))?
+
File::create(format!("{path}/{test_name}-stats.json"))?
90
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.write_all(generated_json_str.as_bytes())?;
+
.write_all(generated_json_str.as_bytes())?;
92
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
93
- 110
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
95
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn read_model_json(
+
pub fn read_model_json(
96
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
97
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_name: &str,
+
test_name: &str,
98
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
prefix: &str,
+
prefix: &str,
99
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_stage: &str,
+
test_stage: &str,
100
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<ConjureModel, std::io::Error> {
+
) -> Result<ConjureModel, std::io::Error> {
101
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_json_str = std::fs::read_to_string(format!(
+
let expected_json_str = std::fs::read_to_string(format!(
102
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
"{path}/{test_name}.{prefix}-{test_stage}.serialised.json"
+
"{path}/{test_name}.{prefix}-{test_stage}.serialised.json"
103
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
105
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_model: ConjureModel = serde_json::from_str(&expected_json_str)?;
+
let expected_model: ConjureModel = serde_json::from_str(&expected_json_str)?;
107
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(expected_model)
+
Ok(expected_model)
108
- 140
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
148
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn save_minion_solutions_json(
+
pub fn save_minion_solutions_json(
149
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
solutions: &Vec<HashMap<Name, Constant>>,
+
solutions: &Vec<HashMap<Name, Constant>>,
150
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
151
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_name: &str,
+
test_name: &str,
152
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
accept: bool,
+
accept: bool,
153
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<JsonValue, std::io::Error> {
+
) -> Result<JsonValue, std::io::Error> {
154
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let json_solutions = minion_solutions_to_json(solutions);
+
let json_solutions = minion_solutions_to_json(solutions);
156
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let generated_json_str = serde_json::to_string_pretty(&json_solutions)?;
+
let generated_json_str = serde_json::to_string_pretty(&json_solutions)?;
158
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
File::create(format!(
+
File::create(format!(
159
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
"{path}/{test_name}.generated-minion.solutions.json"
+
"{path}/{test_name}.generated-minion.solutions.json"
160
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
161
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
.write_all(generated_json_str.as_bytes())?;
+
.write_all(generated_json_str.as_bytes())?;
163
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if accept {
+
if accept {
168
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
170
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(json_solutions)
+
Ok(json_solutions)
171
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
173
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
pub fn read_minion_solutions_json(
+
pub fn read_minion_solutions_json(
174
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
path: &str,
+
path: &str,
175
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
test_name: &str,
+
test_name: &str,
176
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
prefix: &str,
+
prefix: &str,
177
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
) -> Result<JsonValue, anyhow::Error> {
+
) -> Result<JsonValue, anyhow::Error> {
178
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_json_str =
+
let expected_json_str =
179
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
std::fs::read_to_string(format!("{path}/{test_name}.{prefix}-minion.solutions.json"))?;
+
std::fs::read_to_string(format!("{path}/{test_name}.{prefix}-minion.solutions.json"))?;
181
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_solutions: JsonValue =
+
let expected_solutions: JsonValue =
182
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
sort_json_object(&serde_json::from_str(&expected_json_str)?, true);
+
sort_json_object(&serde_json::from_str(&expected_json_str)?, true);
184
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Ok(expected_solutions)
+
Ok(expected_solutions)
185
- 70
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
diff --git a/coverage/main/conjure_oxide/tests/generated_tests.rs.html b/coverage/main/conjure_oxide/tests/generated_tests.rs.html
index 5f330ce6e..ba61c679a 100644
--- a/coverage/main/conjure_oxide/tests/generated_tests.rs.html
+++ b/coverage/main/conjure_oxide/tests/generated_tests.rs.html
@@ -15,7 +15,7 @@
@@ -23,7 +23,7 @@
@@ -470,13 +470,13 @@
28
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
fn integration_test(path: &str, essence_base: &str) -> Result<(), Box<dyn Error>> {
+
fn integration_test(path: &str, essence_base: &str) -> Result<(), Box<dyn Error>> {
29
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let context: Arc<RwLock<Context<'static>>> = Default::default();
+
let context: Arc<RwLock<Context<'static>>> = Default::default();
30
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let accept = env::var("ACCEPT").unwrap_or("false".to_string()) == "true";
+
let accept = env::var("ACCEPT").unwrap_or("false".to_string()) == "true";
31
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let verbose = env::var("VERBOSE").unwrap_or("false".to_string()) == "true";
+
let verbose = env::var("VERBOSE").unwrap_or("false".to_string()) == "true";
32
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
33
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
38
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
41
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let model = parse_essence_file(path, essence_base, context.clone())?;
+
let model = parse_essence_file(path, essence_base, context.clone())?;
42
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
44
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
46
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
context.as_ref().write().unwrap().file_name = Some(format!("{path}/{essence_base}.essence"));
+
context.as_ref().write().unwrap().file_name = Some(format!("{path}/{essence_base}.essence"));
47
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
48
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
save_model_json(&model, path, essence_base, "parse", accept)?;
+
save_model_json(&model, path, essence_base, "parse", accept)?;
49
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_model = read_model_json(path, essence_base, "expected", "parse")?;
+
let expected_model = read_model_json(path, essence_base, "expected", "parse")?;
50
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
52
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
54
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
assert_eq!(model, expected_model);
+
assert_eq!(model, expected_model);
57
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let rule_sets = resolve_rule_sets(
+
let rule_sets = resolve_rule_sets(
58
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
SolverFamily::Minion,
+
SolverFamily::Minion,
59
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
&vec!["Constant".to_string(), "Bubble".to_string()],
+
&vec!["Constant".to_string(), "Bubble".to_string()],
60
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
61
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let model = rewrite_model(&model, &rule_sets)?;
+
let model = rewrite_model(&model, &rule_sets)?;
62
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
64
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
66
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
save_model_json(&model, path, essence_base, "rewrite", accept)?;
+
save_model_json(&model, path, essence_base, "rewrite", accept)?;
67
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_model = read_model_json(path, essence_base, "expected", "rewrite")?;
+
let expected_model = read_model_json(path, essence_base, "expected", "rewrite")?;
68
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
70
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
72
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
assert_eq!(model, expected_model);
+
assert_eq!(model, expected_model);
75
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let solutions = get_minion_solutions(model)?;
+
let solutions = get_minion_solutions(model)?;
76
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let solutions_json = save_minion_solutions_json(&solutions, path, essence_base, accept)?;
+
let solutions_json = save_minion_solutions_json(&solutions, path, essence_base, accept)?;
77
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
79
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
81
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let expected_solutions_json = read_minion_solutions_json(path, essence_base, "expected")?;
+
let expected_solutions_json = read_minion_solutions_json(path, essence_base, "expected")?;
82
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
if verbose {
+
if verbose {
84
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
86
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
assert_eq!(solutions_json, expected_solutions_json);
+
assert_eq!(solutions_json, expected_solutions_json);
88
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
save_stats_json(context, path, essence_base)?;
+
save_stats_json(context, path, essence_base)?;
90
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
91
- 14
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
94
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
fn assert_conjure_present() {
+
fn assert_conjure_present() {
95
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
conjure_oxide::find_conjure::conjure_executable().unwrap();
+
conjure_oxide::find_conjure::conjure_executable().unwrap();
96
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
diff --git a/coverage/main/conjure_oxide/tests/index.html b/coverage/main/conjure_oxide/tests/index.html
index a491e86b3..1eecbf14e 100644
--- a/coverage/main/conjure_oxide/tests/index.html
+++ b/coverage/main/conjure_oxide/tests/index.html
@@ -14,16 +14,16 @@
Lines
-
- 95.51 %
+
+ 0 %
Functions
-
- 96 %
+
+ 0 %
@@ -46,20 +46,20 @@
- 70.49%
+ 0%
- 70.49%
+ 0%
- 43 / 61
+ 0 / 61
-
50%
-
2 / 4
+
0%
+
0 / 4
@@ -69,45 +69,21 @@
- 100%
-
-
-
- 100%
-
-
- 20 / 20
-
-
-
100%
-
1 / 1
-
-
-
-
-
- rewrite_tests.rs
-
-
-
- 96.84%
+ 0%
-
- 96.84%
+
+ 0%
-
- 1042 / 1076
+
+ 0 / 20
- 100%
- 45 / 45
+ 0%
+ 0 / 1
@@ -115,7 +91,7 @@
diff --git a/coverage/main/conjure_oxide/tests/model_tests.rs.html b/coverage/main/conjure_oxide/tests/model_tests.rs.html
index a9533075f..8d6b68a59 100644
--- a/coverage/main/conjure_oxide/tests/model_tests.rs.html
+++ b/coverage/main/conjure_oxide/tests/model_tests.rs.html
@@ -14,16 +14,16 @@
Functions
-
- 100 %
+
+ 0 %
@@ -182,13 +182,13 @@
10
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
fn modify_domain() {
+
fn modify_domain() {
11
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let a = Name::UserName(String::from("a"));
+
let a = Name::UserName(String::from("a"));
12
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
13
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let d1 = Domain::IntDomain(vec![Range::Bounded(1, 3)]);
+
let d1 = Domain::IntDomain(vec![Range::Bounded(1, 3)]);
14
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let d2 = Domain::IntDomain(vec![Range::Bounded(1, 2)]);
+
let d2 = Domain::IntDomain(vec![Range::Bounded(1, 2)]);
15
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
16
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut variables = HashMap::new();
+
let mut variables = HashMap::new();
17
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
variables.insert(a.clone(), DecisionVariable { domain: d1.clone() });
+
variables.insert(a.clone(), DecisionVariable { domain: d1.clone() });
18
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
19
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
let mut m = Model::new(
+
let mut m = Model::new(
20
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
variables,
+
variables,
21
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Expression::And(Metadata::new(), Vec::new()),
+
Expression::And(Metadata::new(), Vec::new()),
22
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
Default::default(),
+
Default::default(),
23
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
24
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
25
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
assert_eq!(m.variables.get(&a).unwrap().domain, d1);
+
assert_eq!(m.variables.get(&a).unwrap().domain, d1);
27
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
m.update_domain(&a, d2.clone());
+
m.update_domain(&a, d2.clone());
28
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
29
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
-
assert_eq!(m.variables.get(&a).unwrap().domain, d2);
+
assert_eq!(m.variables.get(&a).unwrap().domain, d2);
30
- 1
+ class="column is-1 is-narrow p-0 has-text-centered has-text-danger-light has-background-danger"
+ role="cell" aria-label="0">
+
-
diff --git a/coverage/main/conjure_oxide/tests/rewrite_tests.rs.html b/coverage/main/conjure_oxide/tests/rewrite_tests.rs.html
deleted file mode 100644
index ed3fc2ba2..000000000
--- a/coverage/main/conjure_oxide/tests/rewrite_tests.rs.html
+++ /dev/null
@@ -1,20649 +0,0 @@
-
-
-
-
-
Grcov report - rewrite_tests.rs
-
-
-