mirror of
https://github.com/ellmau/adf-obdd.git
synced 2025-12-19 09:29:36 +01:00
Add test-case to show multi-threaded use of the ng solver
Added a bit of documentation on this new feature on the module-page
This commit is contained in:
parent
c6f112b4ed
commit
80e1ca998d
@ -1142,6 +1142,44 @@ mod test {
|
||||
r.iter().collect::<Vec<_>>(),
|
||||
vec![vec![Term(1), Term(0)], vec![Term(0), Term(1)]]
|
||||
);
|
||||
|
||||
// multi-threaded usage
|
||||
let (s, r) = unbounded();
|
||||
let solving = std::thread::spawn(move || {
|
||||
let parser = AdfParser::default();
|
||||
parser.parse()("s(a).s(b).s(c).s(d).ac(a,c(v)).ac(b,b).ac(c,and(a,b)).ac(d,neg(b)).\ns(e).ac(e,and(b,or(neg(b),c(f)))).s(f).\n\nac(f,xor(a,e)).")
|
||||
.unwrap();
|
||||
let mut adf = Adf::from_parser(&parser);
|
||||
adf.stable_nogood_channel(Heuristic::MinModMaxVarImpMinPaths, s.clone());
|
||||
adf.stable_nogood_channel(Heuristic::MinModMinPathsMaxVarImp, s);
|
||||
});
|
||||
|
||||
let mut result_vec = Vec::new();
|
||||
while let Ok(result) = r.recv() {
|
||||
result_vec.push(result);
|
||||
}
|
||||
assert_eq!(
|
||||
result_vec,
|
||||
vec![
|
||||
vec![
|
||||
Term::TOP,
|
||||
Term::BOT,
|
||||
Term::BOT,
|
||||
Term::TOP,
|
||||
Term::BOT,
|
||||
Term::TOP
|
||||
],
|
||||
vec![
|
||||
Term::TOP,
|
||||
Term::BOT,
|
||||
Term::BOT,
|
||||
Term::TOP,
|
||||
Term::BOT,
|
||||
Term::TOP
|
||||
]
|
||||
]
|
||||
);
|
||||
solving.join().unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@ -159,6 +159,39 @@ let printer = adf.print_dictionary();
|
||||
for model in adf.complete() {
|
||||
print!("{}", printer.print_interpretation(&model));
|
||||
}
|
||||
```
|
||||
|
||||
### Using the [`NoGood`]-learner approach, together with the [`crossbeam-channel`] implementation
|
||||
This can be used to have a worker and a consumer thread to print the results as they are computed.
|
||||
Please note that the [`NoGood`]-learner needs a heuristics function to work.
|
||||
The enum [`Heuristic`][adf_bdd::adf::heuristics::Heuristic] allows one to choose a pre-defined heuristic, or implement a `Custom` one.
|
||||
```rust
|
||||
use adf_bdd::parser::AdfParser;
|
||||
use adf_bdd::adf::Adf;
|
||||
use adf_bdd::adf::heuristics::Heuristic;
|
||||
use adf_bdd::datatypes::Term;
|
||||
// create a channel
|
||||
let (s, r) = crossbeam_channel::unbounded();
|
||||
// spawn a solver thread
|
||||
let solving = std::thread::spawn(move || {
|
||||
// use the above example as input
|
||||
let input = "s(a).s(b).s(c).s(d).ac(a,c(v)).ac(b,or(a,b)).ac(c,neg(b)).ac(d,d).";
|
||||
let parser = AdfParser::default();
|
||||
parser.parse()(&input).expect("parsing worked well");
|
||||
// use hybrid approach
|
||||
let mut adf = adf_bdd::adfbiodivine::Adf::from_parser(&parser).hybrid_step();
|
||||
// compute stable with the simple heuristic
|
||||
adf.stable_nogood_channel(Heuristic::Simple, s);
|
||||
});
|
||||
|
||||
// print results as they are computed
|
||||
while let Ok(result) = r.recv() {
|
||||
println!("stable model: {:?}", result);
|
||||
# assert_eq!(result, vec![Term(1),Term(1),Term(0),Term(0)]);
|
||||
}
|
||||
// waiting for the other thread to close
|
||||
solving.join().unwrap();
|
||||
|
||||
```
|
||||
*/
|
||||
#![deny(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user