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 在 算法
每月下载 239次
用于 moc
660KB
14K SLoC
cdshealpix-rust
CDS在Rust中对HEALPix镶嵌的实现,并提供了生成WebAssembly、Python等库的模块
关于
这个库是HEALPix镶嵌在Rust中的实现。这个实现由斯特拉斯堡天文数据中心(Strasbourg astronomical Data Centre,CDS)完成。
它在以下应用中使用:
- Aladin Lite V3
- 在Rust中使用的CDS MOC库,用于
- CDS内部开发
- 请帮助我完善这个列表
最初,它是CDS Java库的一部分的移植,可在这里找到,但在移植代码时添加了一些改进。
关于HEALPix的一般信息,请参阅:
- 官方网站
- 维基百科页面
- 两篇主要参考论文:Gorski (2005) 和 Calabretta (2007)
官方实现可在这里找到。它包含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嵌套方案
- 支持近似
cone
和elliptical cone
覆盖,以及精确的polygon
覆盖查询 - 支持从给定深度的单元格编号列表中创建逻辑操作和
BMOC
(带有标志指示单元格是否完全或部分被表面覆盖) - 支持在
BMOCs
和BMOC
上执行逻辑操作,并从给定深度的单元格编号列表中创建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版本(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任您选择。
贡献
除非您明确声明,否则您提交给本项目以供包含的任何贡献(根据Apache-2.0许可证定义),将按照上述方式双重授权,不附加任何额外条款或条件。
免责声明
这是Rust的第一个代码,欢迎提出建议/反馈。
依赖项
约695KB
约13K SLoC