10 个版本 (6 个重大更新)

0.7.0 2023 年 11 月 21 日
0.6.1 2023 年 7 月 21 日
0.6.0 2023 年 5 月 6 日
0.5.0 2023 年 3 月 25 日
0.1.1 2020 年 5 月 27 日

#502 in 数学

Download history 1/week @ 2024-05-16 2/week @ 2024-05-23 3/week @ 2024-05-30 8/week @ 2024-06-06 6/week @ 2024-06-13 9/week @ 2024-06-20 1/week @ 2024-06-27 8/week @ 2024-07-25

115 个月下载量
5 个 Crates 中使用 (4 个直接使用)

Apache-2.0

1MB
26K SLoC

C 25K SLoC // 0.1% comments Rust 1K SLoC // 0.1% comments

nauty 和 Traces 的低级绑定

该crate提供了对nauty 和 Traces的ffi绑定。Nauty 和 Traces 是计算图自同构算法的实现。

使用方法

将以下行添加到您的 Cargo.toml 中

[dependencies]
nauty-Traces-sys = "0.7"

默认情况下,您需要在系统上安装 C 编译器。有关替代方案,请参阅功能部分

注意事项

  • 您可以使用与该crate捆绑的 nauty 和 Traces 版本或本地安装。这两种选项都有优缺点。请参阅下面的功能部分。请注意,此crate的0.7版本假定 nauty & Traces 版本为2.8.8,可能与其他版本不兼容。

  • 一些 C 宏没有直接等效项。

    • 您可以使用DYNALLSTATDYNALLOC来创建Vec或数组。

    • 大多数DEFAULT-type宏已被替换为rust Default trait的实现。

    • 以下宏被实现为函数

      原始宏 替换
      EMPTY_GRAPH empty_graph
      DEFAULTOPTIONS_SPARSEGRAPH optionsblk::default_sparse()
      DEFAULTOPTIONS_DIGRAPH optionsblk::default_digraph()
      DEFAULTOPTIONS_SPARSEDIGRAPH optionsblk::default_sparse_digraph()
    • SparseGraph结构有助于创建稀疏图。一个&mut SparseGraph可以转换为 nauty 和 Traces 使用的sparsegraph

示例

以下程序打印n边形自同构群的生成元。这是对nauty和Traces套件中的C程序nautyex2的非常直译。

use nauty_Traces_sys::*;
use std::io::{self, Write};
use std::os::raw::c_int;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut options = optionblk::default();
    options.writeautoms = TRUE;
    let mut stats = statsblk::default();

    loop {
        print!("\nenter n : ");
        io::stdout().flush().unwrap();
        let mut input = String::new();
        io::stdin().read_line(&mut input)?;
        let n = input.trim().parse()?;
        if n > 0 {

            let m = SETWORDSNEEDED(n);

            unsafe {
                nauty_check(WORDSIZE as c_int, m as c_int, n as c_int, NAUTYVERSIONID as c_int);
            }

            let mut lab = vec![0; n];
            let mut ptn = vec![0; n];
            let mut orbits = vec![0; n];

            let mut g = empty_graph(m, n);
            for v in 0..n {
                ADDONEEDGE(&mut g, v, (v + 1) % n, m);
            }

            println!("Generators for Aut(C[{}]):", n);

            unsafe {
                densenauty(
                    g.as_mut_ptr(),
                    lab.as_mut_ptr(),
                    ptn.as_mut_ptr(),
                    orbits.as_mut_ptr(),
                    &mut options,
                    &mut stats,
                    m as c_int,
                    n as c_int,
                    std::ptr::null_mut()
                );
            }

            print!("[");
            for orbit in orbits {
                print!("{} ", orbit)
            }
            println!("]");

            print!("order = ");
            io::stdout().flush().unwrap();
            unsafe {
                writegroupsize(stderr, stats.grpsize1, stats.grpsize2);
            }
            println!();
        } else {
            break;
        }
    }
    Ok(())
}

功能

有关功能的信息,请参阅Cargo手册

默认功能

  • bundled:使用此crate附带版本的nauty和Traces。这需要在您的系统上安装C编译器。

    取消激活此功能以使用自定义安装。在这种情况下,您只能释放nauty和Traces分配的内存,如果此crate链接到相同的libc。使用libc功能来生成所需的绑定。

  • tls:确保捆绑库的线程安全性。对应于使用USE_TLS定义编译nauty和Traces。

  • libc:nauty和Traces有时会内部分配内存,例如在nauty_to_sg函数中。此功能启用绑定到DYNFREESG_FREE,这是再次释放此内存所需的。请注意,只有在nauty和Traces与此crate链接到相同的libc时,才能安全地进行此操作。

非默认功能

激活以下功能可能会使生成的二进制文件更快,但更不便携。

  • clz:如果可用,允许使用lzcnt处理器指令。

  • popcnt:如果可用,允许使用popcnt处理器指令。

  • native:允许特定于当前硬件的处理器指令。意味着clzpopcnt

许可证:Apache-2.0

依赖项

~0.1–2MB
~41K SLoC