3个版本 (重大变更)
0.3.0 | 2020年5月6日 |
---|---|
0.2.0 | 2017年1月6日 |
0.1.0 | 2015年10月9日 |
#380 in 压缩
81KB
1.5K SLoC
zdd
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操作都是缓存的:count
、offset
、onset
、change
、union
、inter
、minus
和 subset
。
注意
我在这很久以前写了这个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