Merge pull request #252 from chriseth/print_failing_identity

Print failing identity.
This commit is contained in:
chriseth
2023-05-09 19:28:00 +02:00
committed by GitHub
4 changed files with 16 additions and 10 deletions

View File

@@ -66,7 +66,12 @@ where
.iter()
.filter_map(|(i, c)| (!c.is_zero()).then_some((*i, c)))
}
}
impl<'x, K> AffineExpression<K>
where
K: Copy + Ord + Display + 'x,
{
/// If the affine expression has only a single variable (with nonzero coefficient),
/// returns the index of the variable and the assignment that evaluates the
/// affine expression to zero.
@@ -115,7 +120,7 @@ where
// Try to solve directly.
match self.solve() {
Ok(value) if value.is_complete() => return Ok(value),
Err(()) => return Err(ConstraintUnsatisfiable(String::new())),
Err(()) => return Err(ConstraintUnsatisfiable(self.to_string())),
Ok(value) => {
// sanity check that we are not ignoring anything useful here
assert!(value.constraints.is_empty());

View File

@@ -181,7 +181,7 @@ impl fmt::Display for EvalError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EvalError::ConstraintUnsatisfiable(e) => {
write!(f, "Linear constraint is not satisfiable: {e}",)
write!(f, "Linear constraint is not satisfiable: {e} != 0",)
}
EvalError::Multiple(errors) => {
for e in errors {

View File

@@ -104,7 +104,14 @@ where
kind => {
unimplemented!("Identity of kind {kind:?} is not supported in the executor")
}
};
}
.map_err(|err| {
format!(
"No progress on {identity}:\n{}",
indent(&format!("{err}"), " ")
)
.into()
});
if result.is_err() {
identity_failed = true;

View File

@@ -406,13 +406,7 @@ impl BlockMachine {
};
evaluated.solve_with_bit_constraints(self).map_err(|e| {
let formatted = evaluated.to_string();
if let EvalError::ConstraintUnsatisfiable(_) = e {
EvalError::ConstraintUnsatisfiable(format!(
"Constraint is invalid ({formatted} != 0)."
))
} else {
format!("Could not solve expression {formatted} = 0: {e}").into()
}
format!("Could not solve expression {formatted} = 0: {e}").into()
})
}