#depth #cell #layer #python #data #nside #heal-pix

cdshealpix

HEALPix镶嵌的Rust实现

23个版本

0.6.10 2024年7月19日
0.6.7 2023年12月19日
0.6.6 2023年6月29日
0.6.4 2022年10月17日
0.1.6 2019年3月14日

#133算法

Download history 181/week @ 2024-05-13 12/week @ 2024-05-20 1986/week @ 2024-05-27 244/week @ 2024-06-03 28/week @ 2024-06-10 120/week @ 2024-06-17 174/week @ 2024-06-24 156/week @ 2024-07-01 175/week @ 2024-07-08 263/week @ 2024-07-15 181/week @ 2024-07-22 22/week @ 2024-07-29 10/week @ 2024-08-05 21/week @ 2024-08-12

每月下载 239次
用于 moc

Apache-2.0 OR MIT

660KB
14K SLoC

cdshealpix-rust

CDS在Rust中对HEALPix镶嵌的实现,并提供了生成WebAssembly、Python等库的模块

API Documentation on docs.rs Rust

关于

这个库是HEALPix镶嵌在Rust中的实现。这个实现由斯特拉斯堡天文数据中心(Strasbourg astronomical Data CentreCDS)完成。

它在以下应用中使用:

最初,它是CDS Java库的一部分的移植,可在这里找到,但在移植代码时添加了一些改进。

关于HEALPix的一般信息,请参阅:

官方实现可在这里找到。它包含Fortran、C++、Java、IDL、Python等GPL v2代码。

其他独立的HEALPix实现

  • Astropy-healpix,使用C代码的Python封装器(C代码由Dustin Lang编写,Python封装器由Thomas Robitaille和其他人编写)
  • JavaScript/TypeScript实现,由Koike Michitaro编写
  • Julia实现,由Maurizio Tomasi编写
  • C "官方" 核心功能实现,由Martin Reinecke使用BSD编写
  • ...(请帮助我添加其他HEALPix资源和代码的链接)。

警告

为了在您的特定硬件上获得最佳性能,您可以使用以下方式编译

RUSTFLAGS='-C target-cpu=native' cargo build --release

如果您的处理器支持,它将使用BMI2指令PDEP和PEXT进行位交错。

然而,在AMD Ryzen处理器上对这些指令的实现非常慢(比查找表慢20倍,将hash计算时间翻倍)!您可以使用以下方法进行测试

RUSTFLAGS='-C target-cpu=native' cargo bench

如果ZOrderCurve/BMI的结果比ZOrderCurve/LUPT慢,请在不使用native支持的情况下编译

cargo build --release

在64位Linux上针对32位

rustup target install i686-unknown-linux-gnu
sudo apt-get install gcc-multilib
RUSTFLAGS='-C target-cpu=native' cargo build --target=i686-unknown-linux-gnu --release

特性

  • 支持HEALix嵌套方案
    • 支持近似coneelliptical cone覆盖,以及精确的polygon覆盖查询
    • 支持从给定深度的单元格编号列表中创建逻辑操作和BMOC(带有标志指示单元格是否完全或部分被表面覆盖)
    • 支持在BMOCsBMOC上执行逻辑操作,并从给定深度的单元格编号列表中创建BMOC
  • 支持任何NSIDE的HEALPix Ring方案(即不一定必须是2的幂)

缺少的功能

  • 不支持
    • 方案中的多边形和椭圆
    • 球谐函数计算
    • (请帮助我填写此部分)
  • 尚未实现
    • 精确的锥体和椭圆解(但使用自定义近似方法,可以通过处理假阳性率来处理)
    • 方案中的锥体查询

示例

计算给定位置在单位球上的HEALPix深度的单元格编号。

use cdshealpix::{nside};
use cdshealpix::nested::{get_or_create, Layer};


let depth = 12_u8;
let lon = 12.5_f64.to_radians();
let lat = 89.99999_f64.to_radians();

let nested_d12 = get_or_create(depth);
let nside = nside(depth) as u_64;
let expected_cell_number = nside * nside - 1

assert_eq!(expected_cell_number, nested_d12.hash(lon, lat));

获取给定深度的给定单元格的4个顶点的球坐标

use cdshealpix::nested::{get_or_create, Layer};

let depth = 12_u8;
let cell_number= 10_u64;

let nested_d12 = get_or_create(depth);

let [
  (lon_south, lat_south), 
  (lon_east,  lat_east), 
  (lon_north, lat_north), 
  (lon_west,  lat_west)
] = nested_d12.vertices(cell_number);

获取给定锥体重叠的单元格的分层视图(一个MOC

use cdshealpix::nested::{get_or_create, Layer};

let depth = 6_u8;
let nested_d6 = get_or_create(depth);

let lon = 13.158329_f64.to_radians();
let lat = -72.80028_f64.to_radians();
let radius = 5.64323_f64.to_radians();
 
let moc = nested_d6.cone_overlap_approx(lon, lat, radius);
for cell in moc.into_iter() {
    println!("cell: {:?}", cell);
}

独立

(不在crates.io上,但在github上)独立执行的代码源可以从cli/src/bin.rs中找到。

WebAssembly

(不在crates.io上,但在github上)要构建和使用WebAssembly(和JavaScript)文件,请使用libwasmbingen目录。我们依赖于wasm-bindgen

Python

(不在crates.io上,但在github上)请参阅包含使用CFFI的第一个Python集成的libpython目录。

有关干净的Python包装器和相关Wheels,请参阅Matthieu Baumann的项目cds-healpix-python。要在Python中使用库,请通过pip安装它(示例可在github cds-healpix-python上找到)

pip install cdshealpix

待办事项列表

  • 修改椭圆锥体:计算到两个焦点的距离
  • 实现精确锥体解

许可证

像大多数Rust项目一样,本项目采用Apache许可证2.0版本之一授权

任您选择。

贡献

除非您明确声明,否则您提交给本项目以供包含的任何贡献(根据Apache-2.0许可证定义),将按照上述方式双重授权,不附加任何额外条款或条件。

免责声明

这是Rust的第一个代码,欢迎提出建议/反馈。

依赖项

约695KB
约13K SLoC