Skip to content

Commit 631e01c

Browse files
committed
fix: manager: model enumeration for constants, clippy warnings
1 parent 6254c70 commit 631e01c

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

sdd-rs-lib/manager/manager.rs

+26-15
Original file line numberDiff line numberDiff line change
@@ -585,15 +585,26 @@ impl SddManager {
585585

586586
/// Enumerate models of the SDD.
587587
pub fn model_enumeration(&self, sdd: &SddRef) -> Models {
588+
let all_variables: BTreeSet<_> = self.literal_manager.borrow().all_variables();
588589
let mut models: Vec<BitVec> = Vec::new();
589-
self._model_enumeration(sdd, &mut models);
590590

591-
let all_variables: BTreeSet<_> = self.literal_manager.borrow().all_variables();
592-
let unbound_variables: Vec<_> = all_variables
593-
.difference(&self.get_variables(sdd))
594-
.cloned()
595-
.collect();
596-
SddManager::expand_models(&mut models, &unbound_variables);
591+
if sdd.is_true() {
592+
let all_variables: Vec<_> = all_variables.iter().cloned().collect();
593+
SddManager::expand_models(&mut models, &all_variables);
594+
return Models::new(&models, all_variables.clone());
595+
} else if !sdd.is_false() {
596+
// In the case of False, we do not add any models.
597+
self.model_enumeration_rec(sdd, &mut models);
598+
599+
let all_variables: BTreeSet<_> = self.literal_manager.borrow().all_variables();
600+
let unbound_variables: Vec<_> = all_variables
601+
.difference(&self.get_variables(sdd))
602+
.cloned()
603+
.collect();
604+
605+
SddManager::expand_models(&mut models, &unbound_variables);
606+
}
607+
597608
Models::new(&models, all_variables.iter().cloned().collect())
598609
}
599610

@@ -612,7 +623,7 @@ impl SddManager {
612623
return 0;
613624
}
614625

615-
let models = self._model_count(sdd);
626+
let models = self.model_count_rec(sdd);
616627

617628
if self.root().index() == sdd.vtree().unwrap().index() {
618629
return models;
@@ -870,7 +881,7 @@ impl SddManager {
870881
}
871882

872883
#[instrument(skip_all, level = tracing::Level::DEBUG)]
873-
fn _model_enumeration(&self, sdd: &SddRef, bitvecs: &mut Vec<BitVec>) {
884+
fn model_enumeration_rec(&self, sdd: &SddRef, bitvecs: &mut Vec<BitVec>) {
874885
tracing::debug!(sdd_id = sdd.id().0);
875886
// Return the cached value if it already exists.
876887
if let Some(ref mut models) = sdd.models() {
@@ -912,16 +923,16 @@ impl SddManager {
912923

913924
if prime.is_true() || sub.is_true() {
914925
if prime.is_true() {
915-
self._model_enumeration(sub, &mut models);
926+
self.model_enumeration_rec(sub, &mut models);
916927
} else {
917-
self._model_enumeration(prime, &mut models);
928+
self.model_enumeration_rec(prime, &mut models);
918929
}
919930
} else {
920931
let mut fst = Vec::new();
921932
let mut snd = Vec::new();
922933

923-
self._model_enumeration(prime, &mut fst);
924-
self._model_enumeration(sub, &mut snd);
934+
self.model_enumeration_rec(prime, &mut fst);
935+
self.model_enumeration_rec(sub, &mut snd);
925936

926937
for fst_bv in &fst {
927938
for snd_bv in &snd {
@@ -950,7 +961,7 @@ impl SddManager {
950961
}
951962

952963
/// Count number of models for this SDD.
953-
fn _model_count(&self, sdd: &SddRef) -> u64 {
964+
fn model_count_rec(&self, sdd: &SddRef) -> u64 {
954965
// Return the cached value if it already exists.
955966
if let Some(model_count) = sdd.model_count() {
956967
return model_count;
@@ -969,7 +980,7 @@ impl SddManager {
969980
} else if sdd.is_false() {
970981
0
971982
} else {
972-
self._model_count(sdd)
983+
self.model_count_rec(sdd)
973984
}
974985
};
975986

0 commit comments

Comments
 (0)