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 数学
115 个月下载量
在 5 个 Crates 中使用 (4 个直接使用)
1MB
26K SLoC
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 宏没有直接等效项。
-
您可以使用
DYNALLSTAT
和DYNALLOC来创建
Vec
或数组。 -
大多数
DEFAULT
-type宏已被替换为rustDefault
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
函数中。此功能启用绑定到DYNFREE
和SG_FREE
,这是再次释放此内存所需的。请注意,只有在nauty和Traces与此crate链接到相同的libc时,才能安全地进行此操作。
非默认功能
激活以下功能可能会使生成的二进制文件更快,但更不便携。
-
clz
:如果可用,允许使用lzcnt
处理器指令。 -
popcnt
:如果可用,允许使用popcnt
处理器指令。 -
native
:允许特定于当前硬件的处理器指令。意味着clz
和popcnt
。
许可证:Apache-2.0
依赖项
~0.1–2MB
~41K SLoC