Rust · v1.0.0 · GPL-3.0

更快、更稳的 Rust 版 LightDock——LKlight
面向生产化对接场景。

A High-Performance Rust Reimplementation of the LightDock Glowworm Swarm Optimization Docking Engine

LKlight 是 LightDock 核心引擎在 安全 Rust 中的实现。在 lightdock-rust 开创性工作的基础上,对若干生产化场景中的使用限制进行了完善,并通过 rayon 并行 + SIMD 友好热路径 + thread-local scratch 进一步释放性能。相比 Python 参考实现实测加速 3.0–25.5×

12 类评分函数 8,100 行 Rust 源码 29 / 29 单元测试 160 / 160 综合数值对比 macOS · Linux · Windows
PROJECT INFO · 项目信息

一个 single-binary 的高性能对接引擎。

LKlight 基于 LightDock 0.9.4(Python)与 lightdock-rust(Rust 基线)构建。完全 Rust 实现,单文件可执行,跨平台预编译二进制作为 Release assets 分发。

VERSION
v1.0.0 · 公开仓库 cargo test --lib 全绿,开发阶段 160/160 综合数值对比通过
UPSTREAM BASE
LightDock 0.9.4(Python)+ lightdock-rust(Rust 基线,已深度修复)
BINARY
单文件 LKlight(macOS / Linux / Windows),统一入口 + 13 个子命令
PLATFORMS
macOS arm64 · Linux x86-64 · Windows x86-64
LICENSE
GPL-3.0-or-later(LightDock 衍生作品)
HIGHLIGHTS · 核心亮点

五项核心能力,一次到位

🦀
12 类评分函数全量 Rust 移植
13 个 CLI 方法名(fastdfiredfire 兼容别名),全部通过 cargo test --lib 与 Python 参考实现数值验证
在原 Rust 基线之上系统性补完
lightdock-rust 基础上完善 DFIRE 参数加载、ANM stride、非标残基处理与 ANM atom_count 断言等若干生产化场景中的细节
3.0–25.5× 快于 Python
pydock 3.0× · dna+ANM 16.5× · cpydock 19.2× · dfire 25.5×(macOS arm64,200 glowworms,100 steps)
🚀
面向 GSO 的多层联合优化
rayon 并行受体原子外循环 + SIMD 友好热路径 + thread-local scratch buffer + BufWriter 批写,端到端释放硬件性能
📦
跨平台单二进制
预编译 macOS / Linux / Windows 版本作为 Release assets 分发;便携 CPU baseline 保证兼容性
BACKGROUND · 研究背景

在 LightDock 与 lightdock-rust 之上继续前行

LightDock 在开源对接领域独树一帜,lightdock-rust 又为社区贡献了第一个 Rust 移植。LKlight 在前两者的基础上,进一步面向大规模虚拟筛选场景做生产化打磨与性能优化。

GSO
LightDock 的独特定位
由巴塞罗那超级计算中心开发,基于 萤火虫群优化(GSO)元启发式算法,提供 12 种评分函数、原生 ANM 柔性支持。覆盖蛋白-蛋白、蛋白-DNA、抗体-抗原、跨膜蛋白等多种对接场景。
🐢
Python 在大规模筛选下的性能上限
Python / NumPy 通过广播运算实现隐式向量化,小规模下表现良好;但在百万级虚拟筛选中,解释器开销在每步 GSO 中累积,整体吞吐量仍有显著优化空间。
🦀
lightdock-rust 的开创意义与可完善之处
lightdock-rust 为社区提供了首个 Rust 实现,奠定了重要基础。在此之上,DFIRE 外部参数加载、ANM stride、非标残基处理等细节,可以面向生产化场景做进一步打磨。

GSO 算法的独特价值。 与传统 Monte Carlo 或遗传算法不同,GSO 模拟萤火虫种群通过相互感知萤光素浓度决策移动方向,能够并发维持多个局部极值,更适合高维构象空间的多模态搜索。LightDock v2.0 进一步引入信息驱动约束,支持将实验数据作为对接引导。

致谢与延续。 lightdock-rust 项目为社区贡献了首个 Rust 实现的 LightDock 内核,是 LKlight 工作的直接基础。在该项目的工程框架之上,我们针对若干在生产化使用中观察到的细节进行了补完:

DFIRE 参数加载:原实现以外部文件方式加载参数矩阵,依赖工作目录正确放置;LKlight 改为 include_bytes! 编译期内嵌,零外部依赖。
ANM stride 计算pisa.rs / ddna.rs / cpydock.rs / sd.rs 中 stride 硬编码与某些数据布局不一致,LKlight 统一从 nmodes.len() / (3 × num_anm) 推导。
非标残基处理dfire.rs 在遇到非标准 20 种氨基酸(配体、修饰残基)时缺少降级路径,LKlight 增加警告与 999 惩罚返回。
ANM atom_count 断言simulator.rs 中断言与 ANM 仅覆盖 Cα 原子的事实存在差异,LKlight 改为基于 stride 推导实际原子数。

这些补完不改变原项目的算法设计与工程框架,只为生产化场景去除若干使用门槛。我们也欢迎相关改动以 PR 形式回馈给上游。

面向大规模虚拟筛选的性能空间。 现代药物研发越来越依赖大规模化合物库筛选,百万级配体对接已成常态。LKlight 在 lightdock-rust 的基础上引入 rayon 并行、SIMD 友好热路径、thread-local scratch 复用等多层优化,进一步释放硬件性能。

SIGNIFICANCE · 价值与意义

LKlight 为生态带来三重价值

LKlight 不是简单的语言迁移,而是在 LightDock 与 lightdock-rust 的基础上,为社区补齐「生产化打磨 × 数值可复现 × 性能优化」三个维度。

🔧
生产化打磨
lightdock-rust 基础上,针对 DFIRE 参数加载、ANM stride、非标残基与 atom_count 断言等若干场景进行系统性补完。全部 12 类评分函数均通过 29/29 单元测试与 160/160 综合数值对比。
数量级性能优化
通过 rayon 并行 + SIMD 友好热路径 + thread-local scratch 的多层联合优化,相比 Python 参考实现 提速 3.0–25.5×。让百万级虚拟筛选在单机即可完成。
📦
工程生产力
单文件可执行 + 零外部依赖(DFIRE 参数 include_bytes! 内嵌)+ 跨平台预编译(macOS/Linux/Windows)。部署从"安装 Python 环境 + 配置参数路径"简化为 复制 exe 即用
行业意义:LKlight 与 LightDock、lightdock-rust 共同构成开源 GSO 对接的工具谱系——前两者奠定算法与 Rust 基础,LKlight 则面向大规模生产化场景做进一步打磨与性能优化,相互补充。
ADVANTAGES · 对比优势

vs Python LightDock / lightdock-rust / 其他对接引擎。

LightDock 与 lightdock-rust 各自在算法与工程上有奠基性贡献,LKlight 关注的是面向生产化场景的进一步补完。

能力维度 LKlight Python LightDock lightdock-rust AutoDock Vina
12 类评分函数 ✓ 全量实现 ✓ 参考实现 部分受外部依赖限制 1 类(Vina)
ANM 柔性 ✓ stride 推导补完 stride 实现待完善
DFIRE / DFIRE2 / DDNA ✓ 参数 include_bytes! 内嵌 ✓ 外部文件 外部文件路径依赖
非标残基处理 ✓ 优雅降级(返回 999) 警告跳过 缺少降级路径
并行化 rayon par_iter + SIMD NumPy 隐式 HashMap 网格 OpenMP
pydock 性能
1PPE · 200 glowworms · 100 步
290 ms 858 ms 7,693 ms
dfire 性能 33 ms 840 ms 需先解决参数文件路径
dna+ANM 性能 46 ms 760 ms 14,142 ms
部署方式 单文件 exe 零依赖 Python + NumPy 环境 外部参数文件 单文件
跨平台 macOS · Linux · Windows 三平台 macOS arm64 三平台
测试覆盖 29/29 单元 + 160/160 数值对比 参考基准 基础测试
核心差异化:LKlight 在「12 类评分函数全量 × 生产化打磨 × 数量级加速 × 单文件零依赖 × 三平台」五个维度上做了系统性整合,特别适合 大规模虚拟筛选抗体-抗原对接流水线ANM 柔性蛋白-DNA 对接 等需要长时间稳定运行的场景。算法与工程基础来自 LightDock 与 lightdock-rust,特此致谢。
BENCHMARKS · 性能基准测试

面向生产化场景的 性能优化

测试环境:macOS arm64(Apple Silicon),单 swarm,200 glowworms,100 步,每项 3 次重复取均值。以下为 Python 参考实现与 lightdock-rust 的详细对比数据(与上游项目的差异主要源于并行策略与热路径优化,非算法调整)。

1PPE dfire
25.5×
over Python · dfire
LKlight 33ms
Python 840ms · lightdock-rust 需参数文件路径
1PPE cpydock
19.2×
over Python · 含去溶剂化
LKlight 44ms
Python 844ms · lightdock-rust 7158ms
1AZP dna+ANM
16.5×
over Python · 蛋白-DNA
LKlight 46ms
Python 760ms · lightdock-rust 14142ms
1PPE pydock
3.0×
over Python · 胰蛋白酶-BPTI
LKlight 290ms
Python 858ms · lightdock-rust 7693ms
测试场景 Python (ms) lightdock-rust (ms) LKlight (ms) vs Python vs lightdock-rust
1PPE pydock
胰蛋白酶-BPTI · 357K 原子对
858 7,693 290 3.0× 26.5×
1PPE dfire
DFIRE 统计势
840 需外部参数文件 33 25.5×
1AZP dna+ANM
蛋白-DNA · ANM 模式
760 14,142 46 16.5× 307×
1PPE cpydock
cpyDOCK · 含去溶剂化
844 7,158 44 19.2× 163×
性能说明:对 Python 参考实现的 25.5× dfire 加速中,主要贡献来自 rayon 多核并行(8 核 × ~3× SIMD = ~24×)。与 lightdock-rust 的差异来自并行策略选择(受体原子外循环并行 vs HashMap 空间网格)与热路径连续化,非算法本身差异。
ABSTRACT · 摘要

为什么需要 LKlight

LightDock 是一个基于 萤火虫群优化(Glowworm Swarm Optimization, GSO)算法的开源分子对接框架,由巴塞罗那超级计算中心开发,提供 12 种评分函数,支持蛋白-蛋白、蛋白-DNA 及抗体-抗原对接,并原生支持 各向异性网络模型(ANM) 柔性。

lightdock-rust 项目又为社区贡献了首个 Rust 移植,奠定了重要的工作基础。LKlight 在这些工作之上,面向 大规模虚拟筛选与生产化部署 场景进行进一步打磨与性能优化。

具体而言,LKlight 在 lightdock-rust 基础上进行了 四项生产化补完:(i) DFIRE/DFIRE2/DDNA 参数以 include_bytes! 编译期内嵌,免外部文件依赖;(ii) ANM stride 统一从数据推导,适配不同输入布局;(iii) dfire.rs 为非标准残基增加优雅降级路径;(iv) simulator.rs 从数据推导 ANM 原子数,使含 ANM 的任务顺利运行。

在此基础上,LKlight 进一步应用 多层次性能优化策略rayon 并行化受体原子外循环、SIMD 友好的连续热路径、thread_local! scratch buffer 复用(消除每步堆分配)、SD 评分的 3D 空间哈希网格(9 Å 截断,真正 O(N²)→O(N) 稀疏化)、BufWriter I/O 批写。

基准测试(macOS arm64,200 glowworms,100 steps,n=3)显示:相比 Python 参考实现 提速 3.0–25.5×,与 lightdock-rust 的差异主要来自并行策略选择与热路径连续化(非算法调整)。公开 cargo test --lib 全绿,开发阶段 160/160 综合数值对比通过。
ENHANCEMENTS · 进一步完善

在原项目基础上的系统性补完

以下为 LKlight 在 lightdock-rust 基础上针对生产化场景进行的几项补完。原项目为社区提供了首个 Rust LightDock 实现的重要工作基础,这些完善主要面向部署在多台机器、遇到多样化输入的大规模场景。

Enhancement #1 ✓ include_bytes!
DFIRE 参数编译期内嵌
原项目以外部文件方式加载 DFIRE 参数矩阵,需要将参数文件与工作目录一同分发。LKlight 将 DFIRE/DFIRE2/DDNA 参数以 include_bytes! 或常量数组形式嵌入二进制,零外部依赖,方便于在批量部署场景使用。
Enhancement #2 ✓ Stride 统一
ANM Stride 从数据推导
pisa.rs / ddna.rs / cpydock.rs / sd.rs 中 ANM 原子 stride 原实现为固定 3 × n_atoms,在部分输入上与实际 nmodes.len()/(3 × n_modes) 存在差异。LKlight 统一从数据推导:nm_n = nmodes.len() / (3 * num_anm),并加入 bounds guard。
Enhancement #3 ✓ 优雅降级
非标准残基的降级处理
遇到非标准 20 种氨基酸的残基(配体、修饰残基、小分子)时需要优雅降级路径。LKlight:new() 遇到未知残基时发出警告并 continue 跳过;energy() 对未知残基类型 返回 999(最大惩罚值),仅该配对贡献为惩罚,不影响整体运行。
Enhancement #4 ✓ 从数据推导
simulator.rs atom_count 一致性
原断言 assert_eq!(model.atom_count(), anm_atoms) 隐含“ANM 覆盖全原子”的假设,但 ANM 一般仅覆盖 Cα 原子。LKlight 改为基于 stride 推导实际 ANM 原子数,让含 ANM 的对接任务能顺利运行。
OPTIMIZATIONS · 多层次优化策略

从堆分配消除到并行化,逐项榨取性能

性能突破是多项优化的联合效果,其中最关键的发现是:大截断距离下 HashMap 空间网格反而降速(因为 30 Å 截断时网格几乎不剪枝,查询开销占比高)。撤回 HashMap 网格后改用 rayon 并行化,效果显著。

F1
sqrt_vdw_charges 预计算
pydock/cpydock/sd/dna 热路径中 (rec_vdw[i] * lig_vdw[j]).sqrt() 每次调用约 20 cycles。预计算 sqrt_vdw_charges 字段,热路径替换为乘法
F2
sd.rs 9 Å 空间网格(保留)
SD 截断 9 Å,仅查询 3³=27 格,真正稀疏。实际大多数配体原子在截断外,计算量大幅减少。在 H1 中保留此优化
F3
BufWriter 批写
swarm.rs save() 将每行一次 write syscall 合并为批量写出,显著减少 I/O syscall
F4/F5
栈上固定数组
qt::rotate() 返回 [f64;3](栈上),Glowworm.translationVec<f64> 改为 [f64;3],消除 GSO 运动阶段的频繁小向量分配
G1
Swarm scratch 字段复用
pos_scratch / rot_scratch 字段在 movement_phase()resize + fill 复用,替代每步 Vec::new() + push()
G2
运动阶段并行化
使用 rayon par_iter_mut。预生成 randoms 序列解决线程安全,通过字段级分借(glowworms/pos_s/rot_s 来自不同字段)满足借用检查
H1 ⭐
受体原子外循环并行化(撤回网格)
初始 G3/G4 引入 10 Å HashMap 网格反而降速:每受体原子 343 次 HashMap 查询(≈17μs)远超 O(N²) 数组遍历(≈0.44μs)。撤回网格 + rayon 并行:pydock 从 7693ms 降至 290ms(26.5×)
H2
SIMD 友好热路径
源码层面重写为 连续坐标数组 + 简单内循环 + 少分支,让 LLVM 自动向量化。Release 使用便携 CPU baseline 保证兼容;benchmark 可用 target-cpu=native 观察硬件上限
I1/I2
dfire/dfire2 H1 化
移除 dfire 原始 15Å HashMap 网格(原因同 G3/G4:15Å 覆盖整个受体、几乎不剪枝)。改用 rayon 并行,dfire 从 935ms → 33ms(35× 提升)
I3
sd.rs 并行 + 保留网格
9 Å 网格真正稀疏有效,在并行基础上保留网格进一步减少工作量。Phase 1 并行 + Phase 2 顺序 interface flags
SCORING · 12 类评分函数

完整评分体系,全量 Rust 移植

12 类评分函数均经过独立 Rust 实现,并在开发阶段与 Python 参考值进行数值验证(160/160);公开仓库保留 cargo test --lib 单元测试(29/29)。

评分函数 类别 截断距离 ANM 关键特性
dfire / fastdfire 统计势 15 Å DFIRE 参数内嵌,残基对距离索引
dfire2 统计势 15 Å DFIRE2 参数内嵌
dna 物理化学 30 Å elec / 10 Å vdw DNA-蛋白质专用参数
mj3h 知识势 7.5 Å MJ 残基接触矩阵
pydock 物理化学 30 Å elec / 10 Å vdw Coulomb 静电 + LJ vdW
cpydock 物理化学+溶剂 30 Å elec / 6.4 Å solv pydock + 去溶剂化
sd 溶剂化 9 Å ASA 加权接触去溶剂化(F2 空间网格 ✓)
vdw 物理 10 Å 纯 LJ van der Waals
pisa 统计势 8.5 Å PISA 原子接触统计
sipper 统计势 8.5 Å × 残基对接触势
tobi 统计势 12 Å TOBI 原子对势,消除 sqrt
ddna 统计势 15 Å dDNA 统计势
CLI · 统一命令行

单二进制 + 13 个子命令

公开发布的 LKlight 单二进制入口覆盖 LightDock 常用工作流、分析工具与辅助格式转换。

# 1. 编译发行版 cargo build --release # 2. 运行测试(29/29 单元测试) cargo test --lib # 3. 从 PDB 创建 setup(ANM 可选) ./LKlight setup receptor.pdb ligand.pdb -s 1 -g 200 --anm # 4. 对指定 swarm 运行 GSO(200 glowworms, 100 steps) ./LKlight run setup.json initial_positions_0.dat 100 pydock # 5. 完整流水线(所有 swarms 并行) ./LKlight pipeline receptor.pdb ligand.pdb pydock --threads 8 # 6. 单点评分 ./LKlight score receptor.pdb ligand.pdb # 7. 生成 top 构象 PDB(ANM-aware) ./LKlight generate ... ./LKlight rank | top | filter | cluster
子命令 功能
setup从 PDB 生成 setup.json + swarm 初始目录;支持 --anm 与约束文件
run对指定 swarm 运行 GSO 优化
generate生成 top 构象 PDB · ANM-aware 坐标重构
clusterDBSCAN 式聚类
rank / rank_swarm汇总全部 swarm 或逐 swarm 排名
top从 ranking 生成 Top-N PDB
filter根据 restraints 过滤 ranking
score对 PDB 单点评分,可传平移/四元数
pipeline一条命令完成 setup + run + rank + top

面向生产化场景的 Rust LightDock

LKlight v1.0.0 已在 GitHub 发布。源码完全开源(GPL-3.0),预编译二进制覆盖 macOS / Linux / Windows 三平台。产出单文件 LKlight,无需任何外部依赖。特别感谢 LightDock 与 lightdock-rust 的奠基性工作。