#maps #standard #lite #manipulate #wrapper #healpix #heal-pix

moc

用于创建和操作 HEALPix 多阶覆盖 (MOC) 地图的库,请参阅 https://ivoa.net/documents/MOC/

19 个版本 (10 个重大更改)

0.15.0 2024 年 6 月 28 日
0.13.0 2024 年 5 月 14 日
0.12.1 2023 年 12 月 20 日
0.11.3 2023 年 3 月 31 日
0.6.1 2021 年 11 月 15 日

#74 in 算法

Apache-2.0 OR MIT

1MB
22K SLoC

moc

读取、写入、创建和操作 HEALPix Multi-Order Coverage 地图 (MOCs),即单位球上的离散几何表面。

API Documentation on docs.rs BenchLib

MOC Lib Rust 是 MOCPy 中使用的 Rust MOC 库

MOC Lib Rust 依赖于 CDS HEALPix Rust 库

关于

此 Rust 库实现了 MOC 标准 的 v2.0 版本,包括 (S-)MOCs、T-MOCs 和 ST-MOCs。
它还实现了实验性的 F-MOC(F 代表频率)。

MOC Lib Rust 用于

  • MOCPy,用于操作 MOCs 的 Python 包装器;
  • 用于 Linux、MacOS 和 Windows 的独立命令行工具 MOCli
  • 用于 Linux、MacOS 和 Windows 的独立命令行工具 MOCSet
  • 用于在 Web 浏览器中使用的 WASM 库 MOCWasm

有关能够显示 MOCs 的工具,请参阅

  • Java 的 Aladin Desktop 天体图集(也支持 MOC 操作);
  • Aladin Lite,“在浏览器中运行的 Aladin 天体图集的轻量级版本”;
  • MOCPy 脚本,使用相同的 Rust MOC 库的 Python 包装器。

发布

GitHub 发布 部分编号是 MOCCliMOCSetMOCWasm 的发布编号。

安装/测试

安装 Rust(并检查 ~/.cargo/bin/ 是否在您的路径中),或者使用以下命令更新 Rust 编译器:

rustup update

运行测试(是否有 stdout 输出均可)

cargo test
cargo test -- --nocapture

运行 benches

cargo bench

构建文档

cargo doc --open

构建用于快速测试或最终构建的库

# Fast build (large not optimized file) 
cargo build
# Optimized file
cargo build --release

特别说明

  • 本库的核心非常通用
  • 我们实现了懒加载、流式操作
    • 两个 MOC 之间的操作接收两个迭代器作为输入,并返回一个迭代器(流式处理
    • 您可以通过组合迭代器以零成本的方式组合操作;过程从开始遍历最外层迭代器时开始(懒加载
// Signature of the Union operation between 2 2D-MOCs
pub fn or<T, Q, U, R, I1, J1, K1, I2, J2, K2>(
  left_it: K1,
  right_it: K2
) -> OrRange2Iter<T, Q, I1, I2>
  where
    T: Idx,       // Type of the 1st quantity (e.g. u32 or u64)
    Q: MocQty<T>, // First quantity type, e.g Time
    U: Idx,       // Type of the 2nd quantity (e.g. u32 or u64)
    R: MocQty<U>, // Second quantity type, e.g Space (we use Hpx for HEALPix)
    I1: RangeMOCIterator<T, Qty=Q>,
    J1: RangeMOCIterator<U, Qty=R>,
    K1: RangeMOC2ElemIt<T, Q, U, R, It1=I1, It2=J1>,
    I2: RangeMOCIterator<T, Qty=Q>,
    J2: RangeMOCIterator<U, Qty=R>,
    K2: RangeMOC2ElemIt<T, Q, U, R, It1=I2, It2=J2>

可能的改进/想法

  • RangeMOC2 上添加操作
    • 或者
    • andcomplementfold、...
  • 实现一个函数,将不交的 MOC 划分为一系列的联合 MOC(提示:使用 BMOC 的顺序和标志,标志表示单元格是否已被访问过)。
  • 为 S-MOC 实现紧凑表示(位编码四叉树遍历)
  • 实现紧凑的 S-MOC:单个 z-order 曲线排序的索引数组,使用 2 位标志表示索引是单个索引、范围下界还是范围上界
  • 使用例如 pgx 创建一个 PostgresQL 包装器?

关于 STC-S 到 MOC 函数的警告

STC-S 解析由 STC crate 确保的。

STC 标准与本实现之间的当前差异

  • 已将 DIFFERENCE 操作实现为 symmetric difference
    • 为什么?可能是因为
      1. 我倾向于布尔代数,它有 XOR(排它性 OR 或对称差集),但没有 Difference
      2. 在 STC-S 实现之后阅读了 STC 标准的部分内容
      3. XOR 已经在 cdshleapix 中实现,但 DIFFERENCE 没有实现。
    • STC 标准中已声明:R1R2 = R1 AND (NOT R2));但同时也:R1 - R2 = R1 AND (R1 XOR R2),以及 XOR = (R1 OR R2) AND (NOT (R1 AND R2)) 比简单的 DIFFERENCE 更复杂(因此值得实现?)。
  • 对于 Polygon:我们不使用 STC 惯例
    • 我们支持自相交多边形
    • 我们通常返回面积最小的多边形(使用 NOT 获取其补集!)
    • 一种惯例可能是使用提供的附加(最后)点作为控制点
      • 注意,对于凸多边形,控制点可以是顶点的质心
      • 在GUI中,用户可以通过最后的点击定义多边形的内部
    • 为什么?
      1. 处理多边形的有效算法支持自相交多边形
      2. 以支持用户在Aladin或Aladin Lite等查看器中点击定义任意多边形
      3. cdshleapix基于自相交多边形
  • 对于Box:可以在bsize之后添加一个位置角,作为最后一个参数。

到目前为止,我们拒绝具有

  • ICRS不同的框架
  • Spher2不同的类型
  • degrees不同的单位

许可证

像大多数Rust项目一样,本项目可以根据您的选择在以下许可证下发布:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,包括但不限于代码、文档、示例、模板或其他材料,都应按上述方式双许可,不附加任何额外条款或条件。

警告

代码使用2个制表符进行格式化,而不是常规的4个制表符

cargo fmt -- --config tab_spaces=2

致谢

本研究部分得到了ESCAPE项目的支持。
ESCAPE - 欧洲天文学与粒子物理科学集群(ESFRI)研究基础设施 - 已获得欧盟“地平线2020”研究和创新计划的资金,项目编号为824064。

依赖关系

~7MB
~136K SLoC