#parallel #bdd #symbolic

sys sylvan-sys

Sylvan 并行决策图库的绑定

2 个稳定版本

1.1.0 2023年1月7日
1.0.0 2021年9月7日

#556 in 数学

Apache-2.0

71KB
1.5K SLoC

C 1K SLoC // 0.0% comments Rust 632 SLoC // 0.0% comments

Crates.io Api Docs Continuous integration

Sylvan 库的 Rust 绑定

此 crate 为并行多终端二进制决策图库 Sylvan 提供 Rust 不安全绑定。目前,绑定基于可从 Github 上获取的版本 1.7.1。该 crate 可在 Linux 和 MacOS 上编译,如果可以用 Visual Studio 构建 sylvan,则它也应该在 Windows 上工作(问题主要是正确链接 gmp 库)。

请注意,您需要 cmakegmp(任意精度数字)来构建 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