18个版本

0.8.1 2021年7月24日
0.7.3 2020年9月12日
0.7.0 2020年7月2日
0.5.3 2020年3月25日

#938 in 数据结构


4个crate中使用(通过mop-blocks

Apache-2.0

76KB
1.5K SLoC

ndsparse

CI crates.io Documentation License Rustc

用于存储和检索N维稀疏数据的结构。好吧,不是任何 N ∈ ℕ,而是任何适合您所使用机器指针大小的自然数。例如,一个8位微控制器可以操作多达255维的任何稀疏结构。

对于可能想知道为什么应该使用这个crate的人来说,它通常归结为空间效率、性能和检索速度。以下代码片段展示了使用 _cube_of_vecs 作为最不高效的所有潜在用例。

let _vec_of_options: Vec<Option<i32>> = Default::default();
let _matrix_of_options: [Option<[Option<i32>; 8]>; 16] = Default::default();
let _cube_of_vecs: Vec<Vec<Vec<i32>>> = Default::default();
// The list worsens exponentially for higher dimensions

有关更多信息,请参阅这篇博客文章

示例

use ndsparse::{coo::CooArray, csl::CslVec};

fn main() -> ndsparse::Result<()> {
  // A CSL and COO cube.
  //
  //      ___ ___
  //    /   /   /\
  //   /___/___/ /\
  //  / 1 /   /\/2/
  // /_1_/___/ /\/
  // \_1_\___\/ /
  //  \___\___\/
  let coo = CooArray::new([2, 2, 2], [([0, 0, 0], 1.0), ([1, 1, 1], 2.0)])?;
  let mut csl = CslVec::default();
  csl
    .constructor()?
    .next_outermost_dim(2)?
    .push_line([(0, 1.0)].iter().copied())?
    .next_outermost_dim(2)?
    .push_empty_line()?
    .next_outermost_dim(2)?
    .push_empty_line()?
    .push_line([(1, 2.0)].iter().copied())?;
  assert_eq!(coo.value([0, 0, 0]), csl.value([0, 0, 0]));
  assert_eq!(coo.value([1, 1, 1]), csl.value([1, 1, 1]));
  Ok(())
}

支持的结构

  • 压缩稀疏行(CSL)
  • 坐标格式(COO)

特性

  • no_std 无退出标志
  • 不同的存储(数组、Vec、Slice等)
  • 完全文档化
  • 模糊测试
  • 无不安全

可选特性

  • allocstd
  • 绑定(Py03,wasm-bindgen)
  • 反序列化/序列化(serde)
  • 并行迭代器(rayon)
  • 随机实例(rand)

未来

尽管CSR和COO是通用的稀疏结构,但它们在特定情况下并不足够好,因此存在DIA、JDS、ELL、LIL、DOK等许多其他结构。

如果对此有足够的兴趣,提到的稀疏存储可能会在未来的某个时候添加。

代数库

由于该项目自身的自包含责任和复杂性,该项目不是也不会成为一个稀疏代数库。此外,此类库的良好实现需要大量关于不同算法、操作、分解、求解器和硬件的工作和研究。

替代方案

以下库中的任何一个可能更适合您

依赖关系

~99–610KB
~13K SLoC