Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pumpkin-crates/core/src/containers/sparse_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ impl<T> SparseSet<T> {
}

pub fn set_to_empty(&mut self) {
self.indices = vec![usize::MAX; self.indices.len()];
self.indices.fill(usize::MAX);
self.domain.clear();
self.size = 0;
}
Expand Down
49 changes: 23 additions & 26 deletions pumpkin-crates/core/src/propagators/nogoods/nogood_propagator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,8 @@ impl Propagator for NogoodPropagator {
) -> LazyExplanation<'_> {
let reason = LazyNogoodExplanation::from_bits(code);
let id = reason.nogood_id();
self.temp_nogood_reason.clear();

let result = if reason.explains_extended_propagation() {
// The lazy explanations explains a propagation using extended nogood propagation.
let nogood = &self.nogood_predicates.get_nogood(id);
Expand All @@ -550,19 +552,18 @@ impl Propagator for NogoodPropagator {
let propagating_predicate_id =
PredicateId::create_from_index(reason.unit_propagation_index() as usize);

self.temp_nogood_reason = self
.nogood_predicates
.get_nogood(id)
.iter()
.filter(|&&predicate_id| predicate_id != propagating_predicate_id)
.map(|&predicate_id| context.get_predicate(predicate_id))
.collect::<Vec<_>>();
self.temp_nogood_reason.extend(
self.nogood_predicates
.get_nogood(id)
.iter()
.filter(|&&predicate_id| predicate_id != propagating_predicate_id)
.map(|&predicate_id| context.get_predicate(predicate_id)),
);
} else {
match predicate_to_be_explained.get_predicate_type() {
PredicateType::UpperBound => {
self.temp_nogood_reason = nogood
.iter()
.filter_map(|predicate_id| {
self.temp_nogood_reason
.extend(nogood.iter().filter_map(|predicate_id| {
let predicate = context.get_predicate(*predicate_id);

(context.evaluate_predicate_at_trail_position(
Expand All @@ -574,13 +575,11 @@ impl Propagator for NogoodPropagator {
|| (predicate.is_not_equal_predicate()
&& predicate.get_right_hand_side() > rhs)))
.then_some(predicate)
})
.collect();
}));
}
PredicateType::LowerBound => {
self.temp_nogood_reason = nogood
.iter()
.filter_map(|predicate_id| {
self.temp_nogood_reason
.extend(nogood.iter().filter_map(|predicate_id| {
let predicate = context.get_predicate(*predicate_id);

(context.evaluate_predicate_at_trail_position(
Expand All @@ -592,18 +591,15 @@ impl Propagator for NogoodPropagator {
|| (predicate.is_not_equal_predicate()
&& predicate.get_right_hand_side() < rhs)))
.then_some(predicate)
})
.collect();
}));
}
PredicateType::NotEqual => {
self.temp_nogood_reason = nogood
.iter()
.filter_map(|predicate_id| {
self.temp_nogood_reason
.extend(nogood.iter().filter_map(|predicate_id| {
let predicate = context.get_predicate(*predicate_id);

(predicate.get_domain() != propagated_domain).then_some(predicate)
})
.collect();
}));
}
PredicateType::Equal => unreachable!(),
}
Expand All @@ -614,10 +610,11 @@ impl Propagator for NogoodPropagator {
inference_code: self.inference_codes[info_id].clone(),
}
} else {
self.temp_nogood_reason = self.nogood_predicates.get_nogood(id)[1..]
.iter()
.map(|predicate_id| context.get_predicate(*predicate_id))
.collect::<Vec<_>>();
self.temp_nogood_reason.extend(
self.nogood_predicates.get_nogood(id)[1..]
.iter()
.map(|predicate_id| context.get_predicate(*predicate_id)),
);

let info_id = self.nogood_predicates.get_nogood_index(&id);

Expand Down
Loading