#edge #node #diagram #variables #decision #order #bdd

oxidd-core

OxiDD 决策图框架的核心特性和类型

2 个不稳定版本

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

#37#bdd

Download history 2/week @ 2024-05-03 2/week @ 2024-05-10 40/week @ 2024-05-17 47/week @ 2024-05-24 161/week @ 2024-05-31 66/week @ 2024-06-07 52/week @ 2024-06-14 41/week @ 2024-06-21 19/week @ 2024-06-28 29/week @ 2024-07-05 35/week @ 2024-07-12 37/week @ 2024-07-19 48/week @ 2024-07-26 31/week @ 2024-08-02 29/week @ 2024-08-09 15/week @ 2024-08-16

129 每月下载量
用于 13 crates

MIT/Apache

140KB
2K SLoC

OxiDD

Matrix

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目录定义的。还有一个包含替代实现(此处,边由指针而不是32位索引表示)的oxidd-manager-pointer目录。apply缓存的实现可以在oxidd-cache目录中找到。不同DD类型的缩减规则和主算法在oxidd-rules-*目录中实现。所有组件的“连接”方式有多种。oxidd目录为最终用户提供了合理的默认实例。还有更多的目录,但上述目录是最重要的。

Crate Dependency Graph

除了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可以在您的意见下使用MITApache 2.0许可。

除非您明确声明,否则,根据Apache 2.0许可定义,您提交的任何有意提交给此项目的贡献,将如上所述双重许可,没有任何附加条款或条件。

出版物

介绍OxiDD的开创性论文在TACAS'24上发表。如果您使用OxiDD,请按照以下方式引用我们:

Nils Husung,Clemens Dubslaff,Holger Hermanns,和Maximilian A. Köhl:"OxiDD:一个安全、并发、模块化和高效的Rust决策图框架。" 在:30th国际会议关于系统构造和分析的工具和算法(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,作为德国卓越战略的一部分)。

依赖关系

~50KB