Skip to content

Commit

Permalink
feat: improve strength of element propagator
Browse files Browse the repository at this point in the history
  • Loading branch information
RobbinBaauw committed Jan 17, 2025
1 parent d66ecb6 commit 1de53c6
Showing 1 changed file with 21 additions and 13 deletions.
34 changes: 21 additions & 13 deletions pumpkin-solver/src/propagators/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,20 @@ where
Ok(())
}

fn lazy_explanation(&mut self, code: u64, _: ExplanationContext) -> &[Predicate] {
fn lazy_explanation(&mut self, code: u64, context: ExplanationContext) -> &[Predicate] {
let payload = RightHandSideReason::from_bits(code);

self.rhs_reason_buffer.clear();
self.rhs_reason_buffer
.extend(self.array.iter().map(|variable| match payload.bound() {
Bound::Lower => predicate![variable >= payload.value()],
Bound::Upper => predicate![variable <= payload.value()],
.extend(self.array.iter().enumerate().map(|(idx, variable)| {
if self.index.contains(context.assignments(), idx as i32) {
match payload.bound() {
Bound::Lower => predicate![variable >= payload.value()],
Bound::Upper => predicate![variable <= payload.value()],
}
} else {
predicate![self.index != idx as i32]
}
}));

&self.rhs_reason_buffer
Expand Down Expand Up @@ -129,15 +135,17 @@ where
&self,
context: &mut PropagationContextMut<'_>,
) -> PropagationStatusCP {
let (rhs_lb, rhs_ub) =
self.array
.iter()
.fold((i32::MAX, i32::MIN), |(rhs_lb, rhs_ub), element| {
(
i32::min(rhs_lb, context.lower_bound(element)),
i32::max(rhs_ub, context.upper_bound(element)),
)
});
let (rhs_lb, rhs_ub) = self
.array
.iter()
.enumerate()
.filter(|(idx, element)| context.contains(&self.index, *idx as i32))
.fold((i32::MAX, i32::MIN), |(rhs_lb, rhs_ub), (_, element)| {
(
i32::min(rhs_lb, context.lower_bound(element)),
i32::max(rhs_ub, context.upper_bound(element)),
)
});

context.set_lower_bound(
&self.rhs,
Expand Down

0 comments on commit 1de53c6

Please sign in to comment.