2 个不稳定版本
0.7.0 | 2024年6月5日 |
---|---|
0.6.0 | 2024年4月11日 |
#868 in 数据结构
在 2 个crate中使用(通过 oxidd)
300KB
5.5K SLoC
OxiDD
OxiDD是一个高度模块化的决策图框架,用Rust编写。最显著的决策图实例是由(有序)二进制决策图(BDDs)提供的,它们是布尔函数 𝔹n → 𝔹 的简洁表示。这种BDD表示是规范的,因此,判断布尔函数的相等性——一般是一个co-NP完全问题——可以在常数时间内完成。此外,许多布尔运算可以在两个BDD f,g 之间进行,运算复杂度为 𝒪(|f| · |g|)(其中 |f| 表示 f 中的节点数)。OxiDD旨在成为实现低努力高效实现的框架,它适用于各种其他类型的决策图。
特性
- 已实现多种类型的(有序)决策图
- 二进制决策图(BDDs)
- 具有补边(BCDDs)的BDDs
- 零抑制BDDs(ZBDDs,也称为ZDDs/ZSDDs)
- 多终端BDDs(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
库中。这些特性使得可以通过依赖图轻松地用另一个组件替换一个组件。DD节点存储的数据结构主要是由oxidd-manager-index
库定义的。还有一个oxidd-manager-pointer
库,它包含了一个替代实现(在这里,边由指针表示而不是32位索引)。apply缓存的实现可以在oxidd-cache
库中找到。不同DD种类的简化规则和主算法在oxidd-rules-*
库中实现。所有组件可以通过不同的方式“连接”在一起。oxidd
库为最终用户提供了合理的默认实例化。还有一些其他库,但上述提到的是最重要的。
除了Rust代码外,在bindings
目录下还有C/C++和Python的绑定。OxiDD有一个位于oxidd-ffi
库的外部函数接口(FFI)。它不公开Rust中可用的整个API,但它足以创建BDD并在其上应用各种逻辑运算。原则上,你可以使用任何可以调用C函数的语言来使用FFI。然而,还有更直观的C++绑定,它是基于C FFI构建的。你可以使用CMake包含这个存储库。要从Python使用OxiDD,最简单的方法是使用即将发布的PyPI上的包。
常见问题解答
Q:有什么关于语言X的绑定?
如上所述,OxiDD已经支持C/C++和Python。C#和Java绑定可能会在年底推出。如果您想从不同的语言中使用OxiDD,请与我们联系。我们非常愿意支持您和您的用例。
Q:关于动态/自动重排呢?
OxiDD已经支持建立给定变量顺序的重排。在算法应用操作时不引入不安全代码、不添加相对昂贵的同步机制或完全禁用并发的情况下实现这一点是一个更大的努力。关于这方面的更多细节可以在我们的论文中找到[链接]。但现在,添加如sifting之类的重排启发式方法是一个容易解决的问题。接下来,我们还将致力于动态重排(即因重排而中断操作并在之后重新启动)和自动重排(即识别在何时动态重排有益的启发式方法)。
许可证
OxiDD根据您的意愿,分别受MIT或Apache 2.0许可证的约束。
除非您明确声明,否则根据Apache 2.0许可证定义的,您有意提交给本项目包含的贡献,将如上所述双重许可,不附加任何额外条款或条件。
出版物
介绍OxiDD的开创性论文在TACAS'24上发表。如果您使用OxiDD,请按照以下方式引用我们:
Nils Husung, Clemens Dubslaff, Holger Hermanns, and 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) (accepted for publication 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,作为德国卓越战略的一部分)。
依赖关系
~1.6–2.3MB
~50K SLoC