Skip to content

架构概览

bwa-rust 采用模块化设计,清晰分离索引构建、比对算法和输入输出。


整体架构

┌─────────────────────────────────────────────────────────────┐
│                     CLI Layer (main.rs)                      │
│                  clap 命令解析 + 调度                         │
├─────────────┬─────────────┬──────────────┬──────────────────┤
│    io/      │   index/    │    align/    │      util/       │
│  输入输出    │   索引构建   │   比对算法    │     工具函数     │
├─────────────┼─────────────┼──────────────┼──────────────────┤
│  FASTA      │   SA        │  Seed        │  DNA 编码        │
│  FASTQ      │   BWT       │  Chain       │  反向互补        │
│  SAM        │   FM        │  SW/Extend   │                  │
│             │  Builder    │  Candidate   │                  │
│             │             │  MAPQ        │                  │
│             │             │  Pipeline    │                  │
└─────────────┴─────────────┴──────────────┴──────────────────┘

模块详解

io/ — 输入输出

文件功能
fasta.rsFASTA 解析:多 contig、自动归一化、空序列检测
fastq.rsFASTQ 解析:4 行制记录、seq/qual 长度校验
sam.rsSAM 输出:header 写入、CIGAR/MAPQ/AS/XS/NM 标签

index/ — 索引构建

文件功能复杂度
sa.rs后缀数组:倍增法构建O(n log²n)
bwt.rsBWT:从 SA 直接推导O(n)
fm.rsFM 索引:C 表 + Occ 采样 + 稀疏 SAO(n) 空间
builder.rs从 FASTA 一键构建入口-

align/ — 比对算法

文件功能
mod.rsAlignOpt 配置:打分参数、内存限制
seed.rsSMEM 种子查找,max_occ 过滤
chain.rs种子链构建与过滤,max_chains 限制
sw.rs带状仿射间隙 Smith-Waterman
extend.rs链扩展 + semi-global refinement
candidate.rs候选收集与去重,clip penalty 排序
mapq.rsMAPQ 估算:得分差比例模型
pipeline.rs批量并行比对 pipeline,max_alignments 限制

util/ — 工具函数

文件功能
dna.rsDNA 编码:{0:$, 1:A, 2:C, 3:G, 4:T, 5:N}、归一化、反向互补

内存防护机制

为防止高度重复序列导致内存爆炸,引入三层限制:

┌────────────────────────────────────────────────────────────┐
│                     三层内存防护                            │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  1. max_occ = 500                                         │
│     跳过 SA 区间 > 500 的种子                              │
│     防止 poly-A 等重复序列展开数万位置                      │
│                         ↓                                  │
│  2. max_chains_per_contig = 5                             │
│     每个 contig 最多提取 5 条链                            │
│     防止重复区域产生过多候选                               │
│                         ↓                                  │
│  3. max_alignments_per_read = 5                           │
│     每个 read 最多输出 5 个比对结果                        │
│     控制最终输出规模                                       │
│                                                            │
└────────────────────────────────────────────────────────────┘
参数默认值作用
max_occ500跳过 SA 区间超过此值的种子
max_chains_per_contig5每个 contig 最多提取的链数
max_alignments_per_read5每个 read 最终输出的比对数量上限

索引文件格式

.fm 文件使用 bincode 序列化:

字段类型说明
magicu640x424D_4146_4D5F5253 ("BWAFM_RS")
versionu32格式版本(当前为 2)
sigmau8字母表大小(6)
blocku32Occ 采样块大小
cVec<u32>C 表
bwtVec<u8>BWT 序列
occ_samplesVec<u32>Occ 采样表
saVec<u32>SA(完整或稀疏)
sa_sample_rateu32稀疏采样间隔
contigsVec<Contig>contig 元信息
textVec<u8>原始编码文本
metaOption<IndexMeta>构建元数据

与 BWA 的差异

方面BWA (C)bwa-rust
索引格式.bwt/.sa/.pac 多文件单一 .fm 文件
SA 构造DC3/IS O(n)倍增法 O(n log²n)
MEM 查找双向 BWT单向 backward_search
链构建复杂贪心+DP简化 DP + 贪心剥离
MAPQ复杂统计模型简化得分差比例模型
并行pthreadrayon
配对端✅ 支持📋 v0.2.0
BAM 输出✅ 支持📋 v0.4.0

技术栈

依赖用途
Rust 2021 (MSRV 1.70)系统编程语言
clap 4.5CLI 参数解析
serde + bincode索引序列化
rayon数据并行
criterion基准测试
tikv-jemallocator内存分配器

安全性保证

toml
[lints.rust]
unsafe_code = "forbid"  # 全项目禁止 unsafe
  • 零 unsafe 代码:所有内存安全由编译器保证
  • jemalloc 分配器:非 Windows 平台使用 jemalloc

测试覆盖

类型数量
单元测试188
集成测试11
文档测试2
总计201

基于 MIT 许可证发布