3个版本 (重大变更)

0.3.0 2020年5月6日
0.2.0 2017年1月6日
0.1.0 2015年10月9日

#380 in 压缩

MIT/Apache

81KB
1.5K SLoC

zdd

Build Status Latest Version

zdd 是一个基于Rust的零抑制二值决策图库。它基于 Shin-Ichi Minato的《Zero-suppressed BDDs and their applications》

有关详细信息,请参阅[文档][doc]。

注意

我在这很久以前写了这个crate,当时我还是一个Rust新手。似乎对库没有太多兴趣,所以我只是勉强维护它。如果你认真使用它,请告诉我,看看我或其他人是否能改进或重写它。

(Zero-suppressed BDDs and their applications) [doc]: https://docs.rs/zdd (zdd文档)


lib.rs:

一个基于 Shin-Ichi Minato的这篇论文 的ZDD库。

ZDD是通过哈希合并实现的,因此等性检查是常数时间。由Factory提供的所有ZDD操作都是缓存的:countoffsetonsetchangeunioninterminussubset

注意

我在这很久以前写了这个crate,当时我还是一个Rust新手。似乎对库没有太多兴趣,所以我只是勉强维护它。如果你认真使用它,请告诉我,看看我或其他人是否能改进或重写它。

Factory

Factory 维护ZDD的哈希合并表以及基本操作的缓存。工厂是线程安全的。使用方式类似于 Caml-模块。

use zdd::* ;
let f = Factory::<&'static str>::mk(7) ;

let ref zero = f.zero() ;
let ref one = f.one() ;

let ref x = f.mk_node("x", zero, one) ;
let ref _x = f.change(one, "x") ;
println!(" x: {}",  x) ;
println!("_x: {}", _x) ;
assert!(x == _x) ;

let ref y = f.change(one, "y") ;
let ref x_u_y = f.union(x, y) ;
let ref z = f.change(one, "z") ;
let ref x_u_y_m_z = f.minus(x_u_y, z) ;
assert!(x_u_y_m_z == x_u_y) ;

封装

操作ZDD最简单的方式是使用 wrapped::Zdd,这是一个围绕ZDD及其相关工厂的包装器。

use zdd::wrapped::* ;
let f = mk_factory::<&'static str>(7) ;

let ref one = Zdd::one(&f) ;

let ref x = one ^ "x"         ; // Change "x" in one.
let ref y = one ^ "y"         ; // change "y" in one.
let ref z = one ^ "z"         ; // Change "z" in one.
let ref x_u_y = x + y         ; // Union.
let ref x_u_y_m_z = x_u_y - z ; // Difference.
assert!(x_u_y_m_z == x_u_y) ;

依赖关系

~605KB
~11K SLoC