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 算法
1MB
22K SLoC
moc
读取、写入、创建和操作 HEALPix Multi-Order Coverage 地图 (MOCs),即单位球上的离散几何表面。
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 发布 部分编号是 MOCCli、MOCSet 和 MOCWasm 的发布编号。
安装/测试
安装 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
上添加操作-
或者
-
and
、complement
、fold
、...
-
- 实现一个函数,将不交的 MOC 划分为一系列的联合 MOC(提示:使用 BMOC 的顺序和标志,标志表示单元格是否已被访问过)。
- 为 S-MOC 实现紧凑表示(位编码四叉树遍历)
- 实现紧凑的 S-MOC:单个 z-order 曲线排序的索引数组,使用 2 位标志表示索引是单个索引、范围下界还是范围上界
- 使用例如 pgx 创建一个 PostgresQL 包装器?
关于 STC-S 到 MOC 函数的警告
STC-S 解析由 STC crate 确保的。
STC 标准与本实现之间的当前差异
- 已将
DIFFERENCE
操作实现为symmetric difference
- 为什么?可能是因为
- 我倾向于布尔代数,它有
XOR
(排它性OR
或对称差集),但没有Difference
- 在 STC-S 实现之后阅读了 STC 标准的部分内容
XOR
已经在 cdshleapix 中实现,但DIFFERENCE
没有实现。
- 我倾向于布尔代数,它有
- STC 标准中已声明:
R1 – R2 = 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中,用户可以通过最后的点击定义多边形的内部
- 为什么?
- 处理多边形的有效算法支持自相交多边形
- 以支持用户在Aladin或Aladin Lite等查看器中点击定义任意多边形
- cdshleapix基于自相交多边形
- 对于
Box
:可以在bsize
之后添加一个位置角,作为最后一个参数。
到目前为止,我们拒绝具有
- 与
ICRS
不同的框架 - 与
Spher2
不同的类型 - 与
degrees
不同的单位
许可证
像大多数Rust项目一样,本项目可以根据您的选择在以下许可证下发布:
- Apache许可证第2版 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,包括但不限于代码、文档、示例、模板或其他材料,都应按上述方式双许可,不附加任何额外条款或条件。
警告
代码使用2个制表符进行格式化,而不是常规的4个制表符
cargo fmt -- --config tab_spaces=2
致谢
本研究部分得到了ESCAPE项目的支持。
ESCAPE - 欧洲天文学与粒子物理科学集群(ESFRI)研究基础设施 - 已获得欧盟“地平线2020”研究和创新计划的资金,项目编号为824064。
依赖关系
~7MB
~136K SLoC