2个不稳定版本

0.7.0 2024年6月5日
0.6.0 2024年4月11日

#12 in #oxi-dd

Download history 5/week @ 2024-04-29 29/week @ 2024-05-20 19/week @ 2024-05-27 167/week @ 2024-06-03 25/week @ 2024-06-10 25/week @ 2024-06-17 15/week @ 2024-06-24 6/week @ 2024-07-08 13/week @ 2024-07-15 5/week @ 2024-07-22 24/week @ 2024-07-29 14/week @ 2024-08-05 8/week @ 2024-08-12

53 每月下载量
用于 7 个crate(6直接使用)

MIT/Apache

48KB
872 代码行

OxiDD

Matrix

OxiDD是一个高度模块化的决策图框架,用Rust编写。最突出的决策图实例是由(减少顺序的)二进制决策图(BDD)提供的,它们是布尔函数 𝔹n → 𝔹的简洁表示。这种BDD表示是规范的,因此,判断布尔函数的等价性——一般是一个co-NP完全问题——可以在常数时间内完成。此外,许多布尔运算可以在两个BDD f,g 上进行,时间复杂度为 𝒪(|f| · |g|)(其中 |f| 表示 f 中的节点数)。OxiDD旨在成为一个框架,为各种决策图提供高性能的实现,而无需付出太多努力。

特性

  • 已实现多种(减少顺序的)决策图
    • 二进制决策图(BDDs)
    • 带有补边(BCDDs)的BDD
    • 零抑制BDD(ZBDDs,又称ZDDs/ZSDDs)
    • 多终端BDD(MTBDDs,又称ADDs)
    • 三元决策图(TDDs)
  • 可扩展性:由于OxiDD的模块化设计,可以不重新实现核心数据结构就实现新的决策图类型。
  • 并发:用DD表示的函数可以安全地在多线程环境中使用。此外,应用算法可以并行地在多个CPU核心上执行。
  • 性能:与其他流行的BDD库(例如BuDDy、CUDD和Sylvan)相比,OxiDD已经具有竞争力,甚至超越了它们。
  • 支持重排序:OxiDD可以将决策图重排为给定的变量顺序。支持动态重排序,例如通过筛选,即将到来。

入门

构建公式 (x₁ ∧ x₂) ∨ x₃ 的BDD如下所示

// Create a manager for up to 2048 nodes, up to 1024 apply cache entries, and
// use 8 threads for the apply algorithms. In practice, you would choose higher
// capacities depending on the system resources.
let manager_ref = oxidd::bdd::new_manager(2048, 1024, 8);
let (x1, x2, x3) = manager_ref.with_manager_exclusive(|manager| {(
      BDDFunction::new_var(manager).unwrap(),
      BDDFunction::new_var(manager).unwrap(),
      BDDFunction::new_var(manager).unwrap(),
)});
// The APIs are designed such that out-of-memory situations can be handled
// gracefully. This is the reason for the `?` operator.
let res = x1.and(&x2)?.or(&x3)?;
println!("{}", res.satisfiable());

(我们将在未来添加更详细的指南。)

项目结构

主要代码位于crates目录中。该框架围绕一组核心特性行事,这些特性行事位于oxidd-core crate中。这些特性行事是抽象化的,使得可以轻松地替换一个组件为另一个组件,如以下依赖图所示。DD节点存储的数据结构主要由oxidd-manager-index crate定义。还有oxidd-manager-pointer crate,其中包含一个替代实现(这里,边由指针而不是32位索引表示)。apply缓存的实现可以在oxidd-cache crate中找到。不同DD类型的归约规则和主算法在oxidd-rules-* crate中实现。所有组件可以以不同的方式“连接”在一起。oxidd crate为最终用户提供了合理的默认实例化。还有更多的crate,但上述的是最重要的。

Crate Dependency Graph

除了Rust代码之外,在bindings目录中还有C/C++和Python的绑定。OxiDD有一个位于oxidd-ffi crate的外部函数接口(FFI)。它没有公开可以用于Rust的整个API,但它足以创建BDD并在其上应用各种逻辑运算符。原则上,你可以使用任何可以调用C函数的语言来使用FFI。然而,还有更便捷的C++绑定,它是建立在C FFI之上的。你可以使用CMake来包含这个存储库。要使用Python的OxiDD,最简单的方法是使用即将发布的PyPI上的包。

常见问题解答(FAQ)

问:关于语言X的绑定怎么办?

如上所述,OxiDD已经支持C/C++和Python。C#和Java绑定可能在今年稍后出现。如果你想从不同的语言使用OxiDD,请与我们联系。我们非常希望支持你和你使用的情况。

问:关于动态/自动重排怎么办?

OxiDD已经支持重排,即在算法应用运算符时建立给定的变量顺序。在不引入不安全代码、添加相对昂贵的同步机制或完全禁用并发的情况下实现这一点是一个更大的努力。更多细节可以在我们的论文中找到:我们的论文。但是,现在添加诸如sifting之类的重排启发式方法是低垂之果。接下来,我们还将致力于动态重排(即中止操作以进行重排,然后重新开始)和自动重排(即识别动态重排有益的时间点的启发式方法)。

许可

OxiDD根据您的意见,采用MITApache 2.0许可。

除非您明确说明,否则您提交给本项目作为贡献的任何有意包含的内容,根据Apache 2.0许可的定义,应按照上述方式双重许可,不附加任何额外条款或条件。

出版物

介绍OxiDD的重要论文已在TACAS'24上发表。如果你使用了OxiDD,请引用我们如下:

Nils Husung, Clemens Dubslaff, Holger Hermanns, 和 Maximilian A. Köhl: OxiDD: A safe, concurrent, modular, and performant decision diagram framework in Rust. In: Proceedings of the 30th International Conference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS’24) (接受发表2024)

@inproceedings{oxidd24,
  author        = {Husung, Nils and Dubslaff, Clemens and Hermanns, Holger and K{\"o}hl, Maximilian A.},
  booktitle     = {Proceedings of the 30th International Conference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS'24)},
  title         = {{OxiDD}: A Safe, Concurrent, Modular, and Performant Decision Diagram Framework in {Rust}},
  year          = {2024},
  doi           = {10.1007/978-3-031-57256-2_13}
}

致谢

本工作部分得到了德国研究基金会(DFG)的支持,项目为TRR 248(见 https://perspicuous-computing.science,项目ID 389792660)和EXC 2050/1(CeTI,项目ID 390696704,作为德国卓越战略的一部分)。

依赖项

~335–800KB
~18K SLoC