3 个版本

0.1.2 2021年3月4日
0.1.1 2020年12月7日
0.1.0 2020年9月7日

#15 in #edit-distance

MIT/Apache

160KB
2.5K SLoC

C++ 2K SLoC // 0.2% comments Rust 316 SLoC // 0.1% comments Cython 176 SLoC // 0.3% comments Python 124 SLoC // 0.1% comments C 7 SLoC

edlib_rs

此软件包提供了对 Martin Šošić 的 Edlib C++ 库的 Rust 接口。请参阅 Martinsos-edlib

参考文献是:

Martin Šošić, Mile Šikić; Edlib: a C/C++ library for fast, exact sequence alignment using edit distance. Bioinformatics 2017 [btw753. doi] https://doi.org/10.1093/bioinformatics/btw753

此软件包为 edlib 提供了 2 个接口。
第一个,通过模块绑定访问,是 bindgen 软件包生成的接口。
第二个,通过模块 edlibrs 访问,提供了一种更符合 Rust 习惯的接口。它以在 C 的 struct EdlibAlignResult 中存储的信息(startLocations 和 endLocations 指针)克隆信息为代价,以获得具有 Option> 字段的 Rust struct EdlibAlignResultRs。当计算 cigar 字符串表示时,也会进行克隆。
因此,内存管理完全转移到 Rust。
结构和函数的名称与 edlib 中相同,只是在原始名称后附加 "Rs"。

示例

对于 edlibrs 接口,例如:

在正常模式下

    use edlib_rs::edlibrs::*;
    ...
    let query = "ACCTCTG";
    let target = "ACTCTGAAA";
    let align_res = edlibAlignRs(query.as_bytes(), target.as_bytes(), &EdlibAlignConfigRs::default());
    assert_eq!(align_res.status, EDLIB_STATUS_OK);
    assert_eq!(align_res.editDistance, 4);

在中间模式

    use edlib_rs::edlibrs::*;
    ...
    let query = "ACCTCTG";
    let target = "TTTTTTTTTTTTTTTTTTTTTACTCTGAAA";
    //
    let mut config = EdlibAlignConfigRs::default();
    config.mode = EdlibAlignModeRs::EDLIB_MODE_HW;
    let align_res = edlibAlignRs(query.as_bytes(), target.as_bytes(), &config);
    assert_eq!(align_res.editDistance, 1);

安装

该软件包将原始 Edlib 库源代码嵌入到源代码树中(请参阅目录 edlib-c,对应于 2020 年 12 月的源代码),但省略了原始的 test_data 目录以限制软件包的大小。标准的 "cargo build" 命令运行 edlib 的 cmake。

该软件包启用了一个记录器来监视对 C 接口的调用,默认情况下在 Cargo.toml 中设置为发布模式为 info 和调试模式为 trace,但可以通过设置变量 RUST_LOG 来更改(请参阅 env_logger 文档)。

测试

模块 edlib.rs 中的某些测试可以充当基本示例。
在目录 examples 中还有一个 edlib edaligner 模块的小版本(请参阅 edlib 安装目录中的 apps/aligner),该模块可以在只包含一个序列的 Fasta 文件上运行,该序列包含在原始 edlib 目录的 test_data 中。
由于嵌入的源代码不包含原始的 test_data 子目录,因此必须单独下载它们才能运行 edaligner 示例模块。
与 edlib 版本不同,该模块在查询序列和目标序列给定的情况下运行 3 种模式(正常/NW、前缀/SHW 和中间/HW)的单次通过。

使用 RUST_LOG=info ./target/release/examples/edaligner --dirdata "$edlibpath/test_data/Enterobacteria_Phage_1" --tf "Enterobacteria_phage_1.fasta" --qf "mutated_90_perc.fasta"

我们得到以下发布模式下的时间,以 Enterobacteria_phage_1.fasta 作为目标序列,以 mutated_90_perc.fasta 作为查询序列。

模式 edlibrs 时间(s) edlib 时间(s) 距离
NW 0.106 0.106 9506
SHW 0.184 0.191 9502
HW 0.682 0.695 9502

以 Enterobacteria_phage_1.fasta 作为目标序列和 mutated_60_perc.fasta 作为查询序列,在发布模式下我们得到了以下时间。

模式 edlibrs 时间(s) edlib 时间(s) 距离
NW 0.398 0.398 39829
SHW 0.670 0.684 39828
HW 1.182 1.206 39828

除了 CPU 时间测量的微小变化外,我们看到了相同的计算时间。

许可证

许可协议为以下之一:

任选其一。

此软件是在我在 CEACEA-LIST 工作期间编写的。

依赖关系

约 4–14MB
~148K SLoC