use super::*;
pub struct EqualityConstraint {
a: VariableId,
b: VariableId,
}
impl EqualityConstraint {
pub fn new(a: VariableId, b: VariableId) -> Self {
EqualityConstraint { a, b }
}
}
impl<'c> Constraint<'c> for EqualityConstraint {
fn variables(&self) -> VariableSet {
let mut vs = VariableSet::new_empty();
vs.set(self.a);
vs.set(self.b);
vs
}
fn estimate(&self, variable: VariableId, binding: &Binding) -> Option<usize> {
if variable == self.a {
if binding.get(self.b).is_some() {
Some(1)
} else {
None
}
} else if variable == self.b {
if binding.get(self.a).is_some() {
Some(1)
} else {
None
}
} else {
None
}
}
fn propose(&self, variable: VariableId, binding: &Binding, proposals: &mut Vec<RawValue>) {
if variable == self.a {
if let Some(v) = binding.get(self.b) {
proposals.push(*v);
}
} else if variable == self.b {
if let Some(v) = binding.get(self.a) {
proposals.push(*v);
}
}
}
fn confirm(&self, variable: VariableId, binding: &Binding, proposals: &mut Vec<RawValue>) {
if variable == self.a {
if let Some(peer) = binding.get(self.b) {
proposals.retain(|v| v == peer);
}
} else if variable == self.b {
if let Some(peer) = binding.get(self.a) {
proposals.retain(|v| v == peer);
}
}
}
fn satisfied(&self, binding: &Binding) -> bool {
match (binding.get(self.a), binding.get(self.b)) {
(Some(a), Some(b)) => a == b,
_ => true,
}
}
}