2 个稳定版本
1.1.0 | 2023年1月7日 |
---|---|
1.0.0 | 2021年9月7日 |
#556 in 数学
71KB
1.5K SLoC
Sylvan 库的 Rust 绑定
此 crate 为并行多终端二进制决策图库 Sylvan 提供 Rust 不安全绑定。目前,绑定基于可从 Github 上获取的版本 1.7.1
。该 crate 可在 Linux 和 MacOS 上编译,如果可以用 Visual Studio 构建 sylvan
,则它也应该在 Windows 上工作(问题主要是正确链接 gmp
库)。
请注意,您需要
cmake
和gmp
(任意精度数字)来构建 Sylvan。希望gmp
将很快成为可选的,但到目前为止它是必需的。
由于 Sylvan 的许多功能都是使用预处理器宏定义的,因此有一个小的包装库(./wrapper/src
),它将每个宏导出为函数(这可能会产生微小的性能开销,但可以通过启用链接时间优化来大部分缓解)。包装库还使用 Sylvan_
前缀为每个函数/宏命名,以便它们清晰地标记为 Sylvan API 的一部分。有关文档,请参阅原始源代码和 教程。
unsafe fn main() {
Lace_start(0, 0); // auto-detect thread count
// 2MB memory limit should be enough for a small test:
Sylvan_set_limits(1 << 21, 1, 5);
Sylvan_init_package();
Sylvan_init_bdd();
Sylvan_gc_disable();
Sylvan_register_quit(termination_handler);
// Check that the basic identity (a & b) <=> !(!a | !b) holds.
let a = Sylvan_ithvar(1);
let b = Sylvan_ithvar(2);
let not_a = Sylvan_mtbdd_not(a);
let not_b = Sylvan_mtbdd_not(b);
let a_and_b = Sylvan_mtbdd_times(a, b);
let not_a_or_b = Sylvan_mtbdd_not(Sylvan_mtbdd_plus(not_a, not_b));
// The BDD has three nodes:
assert_eq!(3, Sylvan_nodecount(a_and_b));
// And the identity holds:
assert_eq!(a_and_b, not_a_or_b);
Sylvan_quit();
Lace_stop();
}
在 test.rs
模块中还有一个稍微复杂一点的示例。
完整性:API 的大部分应该在此处完全重现(包括具有回调的函数等)。一些小方面(如 sylvan_stats
结构体或更高级的 lace 功能)缺失,但如果需要,可以创建问题,稍后可以添加。**从 1.7.0
开始,Sylvan 还包括 ZDD 的实现。目前,此实现不包括在此包装库中,但请随意创建 PR :)。
正确性:遗憾的是,Sylvan 不能直接使用 bindgen
处理,因此使用半自动方法重现 API,并进行手动验证步骤(一些人类确保没有破坏任何东西的 regex)。因此,可能存在一些需要解决的问题的小问题。如果发现任何意外的行为或段错误,请提交问题。
依赖关系
~0.4–265KB