Skip to content

Commit

Permalink
Merge pull request #30 from timbeurskens/feature/tabular-truth-table
Browse files Browse the repository at this point in the history
Feature/tabular truth table
  • Loading branch information
timbeurskens authored Apr 3, 2022
2 parents a5167a7 + 0327461 commit 3fae079
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rsbdd"
version = "0.6.6"
version = "0.7.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
10 changes: 10 additions & 0 deletions src/bdd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ pub enum TruthTableEntry {
Any,
}

impl Display for TruthTableEntry {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.pad(match self {
TruthTableEntry::True => "True",
TruthTableEntry::False => "False",
TruthTableEntry::Any => "Any",
})
}
}

impl<S: BDDSymbol> Default for BDD<S> {
fn default() -> Self {
BDD::False
Expand Down
32 changes: 28 additions & 4 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use rsbdd::bdd_io::*;
use rsbdd::parser::*;
use rsbdd::parser_io::*;
use rsbdd::plot::*;
use std::cmp::max;
use std::fs::File;
use std::io;
use std::io::{BufRead, BufReader};
Expand Down Expand Up @@ -93,8 +94,24 @@ fn main() {
_ => TruthTableEntry::Any,
};

let widths: Vec<usize> = input_parsed
.free_vars
.iter()
.map(|v| max(5, v.len()) as usize)
.collect();

if args.is_present("show_truth_table") {
println!("{:?}", input_parsed.free_vars);
print!("|");
for free_var in &input_parsed.free_vars {
let len = 1 + max(5, free_var.len());
print!(" {:indent$}|", free_var, indent = len);
}
println!();
for width in &widths {
print!("|{:->width$}", "", width = *width + 2);
}
println!("|");
// println!("{:?}", input_parsed.free_vars.join("|"));
print_truth_table_recursive(
&result,
input_parsed
Expand All @@ -104,6 +121,7 @@ fn main() {
.collect(),
filter,
&input_parsed,
&widths,
);
}

Expand Down Expand Up @@ -191,6 +209,7 @@ fn plot_performance_results(results: &[Duration]) {
.expect("Could not wait for gnuplot to finish");
}

// print all variables which can take a 'true' value in the bdd
fn print_true_vars_recursive(
root: &Rc<BDD<NamedSymbol>>,
values: Vec<TruthTableEntry>,
Expand Down Expand Up @@ -230,24 +249,29 @@ fn print_truth_table_recursive(
vars: Vec<TruthTableEntry>,
filter: TruthTableEntry,
parsed: &ParsedFormula,
sizes: &[usize],
) {
match root.as_ref() {
BDD::Choice(ref l, s, ref r) => {
// first visit the false subtree
let mut r_vars = vars.clone();
r_vars[parsed.to_free_index(s)] = TruthTableEntry::False;
print_truth_table_recursive(r, r_vars, filter, parsed);
print_truth_table_recursive(r, r_vars, filter, parsed, sizes);

// then visit the true subtree
let mut l_vars = vars;
l_vars[parsed.to_free_index(s)] = TruthTableEntry::True;
print_truth_table_recursive(l, l_vars, filter, parsed);
print_truth_table_recursive(l, l_vars, filter, parsed, sizes);
}
c if (filter == TruthTableEntry::Any)
|| (filter == TruthTableEntry::True && *c == BDD::True)
|| (filter == TruthTableEntry::False && *c == BDD::False) =>
{
println!("{:?} {:?}", vars, c)
print!("|");
for (i, var) in vars.iter().enumerate() {
print!(" {:indent$} |", var, indent = sizes[i]);
}
println!(" {:?}", c);
}
_ => {}
}
Expand Down

0 comments on commit 3fae079

Please sign in to comment.