3 个版本 (破坏性更新)

0.3.0 2022年5月25日
0.2.0 2022年2月17日
0.1.0 2022年2月11日

#1330 in 数学

BSD-2-Clause

33KB
577

nnls

这是nnls(非负最小二乘法)的Rust版本。它是从Fortran90脚本移植过来的,该脚本由scipy.optimize.nnls和其他几个库使用。

为什么?

我决定将nnls移植到Rust,因为

  • nnls的C版本不是线程安全的!代码中有几个static变量,这使得它在并行环境中无法使用。如果您计划只使用单线程的nnls,您可能更喜欢链接到那个版本:它已经过大量测试,没有已知问题。
  • Fortran版本(77和90)需要一些Fortran内存模型的知识和一些编译器技巧才能成功链接。我没有做到这一点,而且我不想在这个冒险中浪费更多时间,所以我只是将脚本移植到了Rust。

优势

  • 它已经被使用了几百万次,很快将会被使用数十亿次。我处理3D图像,我看到的每一张图像都包含大约100万个体素。对于特定的算法,我需要为每个体素调用nnls 2次。其中一些图像已经过测试并与原始Fortran版本进行了比较。
  • 没有unsafe,并且在这个crate中禁止使用。

问题

  • 这不是典型的Rust。我试图清理和增强代码,但并不总是可能。
  • 我使用了ndarray。您可能更喜欢其他一些东西。我目前不打算改变这一点,但欢迎讨论。
  • 代码中目前有1个panic!,因为原始代码中有1个使用goto的代码路径,我无法正确转换为Rust。我计划处理这种情况,但后来发现它从未被调用。正如我写的,nnls已经被广泛使用,我找不到任何数据集可以触发该条件。如果我的程序因为这个问题而崩溃,它将很快得到修复。

依赖关系

~3.5MB
~59K SLoC