221 个版本
0.37.9 | 2024年7月30日 |
---|---|
0.37.6 | 2024年6月19日 |
0.35.1 | 2024年3月29日 |
0.34.3 | 2023年11月25日 |
0.6.6 | 2018年11月29日 |
#16 in 数学
42,865 每月下载量
用于 17 个 包(7 个直接使用)
1MB
17K SLoC
Peroxide
Peroxide Rust 数字库包含线性代数、数值分析、统计和机器学习工具,语法类似于 R、MATLAB 和 Python。
目录
为什么选择 Peroxide?
1. 定制功能
Peroxide 提供各种功能。
default
- 纯 Rust(无架构依赖 - 完美交叉编译)O3
- BLAS & LAPACK(性能完美但设置稍微困难 - 强烈推荐查看 带有 BLAS 的 Peroxide)plot
- 使用 Python 的 matplotlib 绘制任何图表。nc
- 使用 DataFrame 处理 netcdf 文件格式。csv
- 使用矩阵或 DataFrame 处理 csv 文件格式。parquet
- 使用 DataFrame 处理 parquet 文件格式。serde
- 使用 Serde 进行序列化。
如果您想进行高性能计算并使用更多线性代数,则选择 O3
功能。如果您不想依赖 C/C++ 或 Fortran 库,则选择 default
功能。如果您想使用一些优秀的模板绘制图表,则选择 plot
功能。
您可以同时选择任何功能。
2. 易于优化
过氧化物使用一维数据结构来表示矩阵,这使得它能够方便地与BLAS(基本线性代数子程序)集成。这意味着过氧化物可以通过利用BLAS提供的优化例程来保证线性代数计算的卓越性能。
3. 语法友好
对于熟悉NumPy、MATLAB或R等数值计算库的用户来说,Rust的语法一开始可能会显得陌生。这可能会使学习和使用依赖Rust独特特性和语法的Rust库变得更加具有挑战性。
然而,过氧化物旨在通过提供类似流行数值计算环境风格的语法来弥合这一差距。使用过氧化物,您可以使用类似于R、NumPy或MATLAB的语法执行复杂计算,从而帮助这些背景的用户更容易地适应Rust并利用其性能优势。
例如,
#[macro_use]
extern crate peroxide;
use peroxide::prelude::*;
fn main() {
// MATLAB like matrix constructor
let a = ml_matrix("1 2;3 4");
// R like matrix constructor (default)
let b = matrix(c!(1,2,3,4), 2, 2, Row);
// Or use zeros
let mut z = zeros(2, 2);
z[(0,0)] = 1.0;
z[(0,1)] = 2.0;
z[(1,0)] = 3.0;
z[(1,1)] = 4.0;
// Simple but effective operations
let c = a * b; // Matrix multiplication (BLAS integrated)
// Easy to pretty print
c.print();
// c[0] c[1]
// r[0] 1 3
// r[1] 2 4
// Easy to do linear algebra
c.det().print();
c.inv().print();
// and etc.
}
4. 可以选择两种不同的编码风格。
在过氧化物中,有两种不同的选项。
prelude
:简单使用。fuga
:显式选择数值算法。
例如,让我们看看范数。
在prelude
中,使用norm
很简单:a.norm()
。但它只对Vec<f64>
使用L2范数。(对于Matrix
,Frobenius范数。)
#[macro_use]
extern crate peroxide;
use peroxide::prelude::*;
fn main() {
let a = c!(1, 2, 3);
let l2 = a.norm(); // L2 is default vector norm
assert_eq!(l2, 14f64.sqrt());
}
在fuga
中,可以使用各种范数。但您需要写的内容会比prelude
长一些。
#[macro_use]
extern crate peroxide;
use peroxide::fuga::*;
fn main() {
let a = c!(1, 2, 3);
let l1 = a.norm(Norm::L1);
let l2 = a.norm(Norm::L2);
let l_inf = a.norm(Norm::LInf);
assert_eq!(l1, 6f64);
assert_eq!(l2, 14f64.sqrt());
assert_eq!(l_inf, 3f64);
}
5. 内置功能
过氧化物可以做很多事情。
- 线性代数
- 有效的矩阵结构
- 转置、行列式、对角线
- LU分解、逆矩阵、块划分
- QR分解(
O3
功能) - 奇异值分解(
O3
功能) - Cholesky分解(
O3
功能) - 简化行阶梯形
- 列、行操作
- 特征值、特征向量
- 函数式编程
- 使用
Vec<f64>
进行更简单的函数式编程 - 对于矩阵,有三个映射
fmap
:对所有元素进行映射col_map
:对列向量进行映射row_map
:对行向量进行映射
- 使用
- 自动微分
- 泰勒模式前向AD - 用于第n阶AD
- 精确雅可比矩阵
Real
特质以约束f64
和AD
(用于常微分方程)
- 数值分析
- Lagrange插值
- 样条曲线
- 三次样条
- 三次Hermite样条
- 通过Akima估计斜率
- 通过二次插值估计斜率
- B样条
- 非线性回归
- 梯度下降
- Levenberg Marquardt
- 常微分方程
- 基于特质的常微分方程求解器(在
v0.36.0
之后) - 显式积分器
- Ralston的3阶
- Runge-Kutta 4阶
- Ralston的4阶
- Runge-Kutta 5阶
- 嵌入式积分器
- Bogacki-Shampine 3(2)
- Runge-Kutta-Fehlberg 4(5)
- Dormand-Prince 5(4)
- Tsitouras 5(4)
- 隐式积分器
- Gauss-Legendre 4阶
- 基于特质的常微分方程求解器(在
- 数值积分
- Newton-Cotes求积
- Gauss-Legendre求积(高达30阶)
- Gauss-Kronrod求积(自适应)
- G7K15, G10K21, G15K31, G20K41, G25K51, G30K61
- Gauss-Kronrod求积(相对容差)
- G7K15R, G10K21R, G15K31R, G20K41R, G25K51R, G30K61R
- 根寻找
- 基于特征的根寻找(在
v0.37.0
之后) - 二分法
- 假位法
- 割线法
- 牛顿法
- Broyden法
- 基于特征的根寻找(在
- 统计
- 使用
rand
crate 更容易的随机 - 有序统计
- 中位数
- 分位数(与R分位数匹配)
- 概率分布
- 伯努利分布
- 均匀分布
- 二项分布
- 正态分布
- 伽马分布
- 贝塔分布
- 学生t分布
- 加权的均匀分布
- RNG算法
- 接受/拒绝
- Marsaglia极坐标
- 金字塔
- 为
rand-dist
crate 提供包装器 - 分段拒绝抽样
- 混淆矩阵与度量
- 使用
- 特殊函数
- 为
puruspe
crate 提供包装器(纯Rust)
- 为
- 工具
- R语言风格宏和函数
- Matlab风格宏和函数
- Numpy风格宏和函数
- Julia风格宏和函数
- 绘图
- 使用
pyo3
和matplotlib
- 使用
- DataFrame
- 支持同时读取多种类型
- 读取和写入
csv
文件(csv
功能) - 读取和写入
netcdf
文件(nc
功能) - 读取和写入
parquet
文件(parquet
功能)
6. 与数学兼容
从 0.23.0
开始,过氧化物与数学结构兼容。 Matrix
、Vec<f64>
、f64
被视为内积向量空间。并且 Matrix
、Vec<f64>
是线性算子 - Vec<f64>
到 Vec<f64>
和 Vec<f64>
到 f64
。对于未来,过氧化物将包含更多和更多的数学概念。(但仍然实用。)
7. 使用 Rust 编写
Rust 提供了强大的类型系统、所有权概念、借用规则等特性,使开发者能够编写安全高效的代码。它还提供了现代编程技术,如基于特征的抽象和方便的错误处理。Peroxide 的开发是为了充分利用 Rust 的这些优势。
示例代码演示了如何使用 Peroxide 模拟洛伦兹吸引子并可视化结果。它展示了 Rust 提供的一些强大功能,例如用于简化错误处理的 ?
操作符和用于抽象常微分方程问题的 ODEProblem
特性。
use peroxide::fuga::*;
fn main() -> Result<(), Box<dyn Error>> {
let rkf45 = RKF45::new(1e-4, 0.9, 1e-6, 1e-2, 100);
let basic_ode_solver = BasicODESolver::new(rkf45);
let (_, y_vec) = basic_ode_solver.solve(
&Lorenz,
(0f64, 100f64),
1e-2,
)?; // Error handling with `?` - can check constraint violation and etc.
let y_mat = py_matrix(y_vec);
let y0 = y_mat.col(0);
let y2 = y_mat.col(2);
// Simple but effective plotting
let mut plt = Plot2D::new();
plt
.set_domain(y0)
.insert_image(y2)
.set_xlabel(r"$y_0$")
.set_ylabel(r"$y_2$")
.set_style(PlotStyle::Nature)
.tight_layout()
.set_dpi(600)
.set_path("example_data/lorenz_rkf45.png")
.savefig()?;
Ok(())
}
struct Lorenz;
impl ODEProblem for Lorenz {
fn initial_conditions(&self) -> Vec<f64> {
vec![10f64, 1f64, 1f64]
}
fn rhs(&self, t: f64, y: &[f64], dy: &mut [f64]) -> anyhow::Result<()> {
dy[0] = 10f64 * (y[1] - y[0]);
dy[1] = 28f64 * y[0] - y[1] - y[0] * y[2];
dy[2] = -8f64 / 3f64 * y[2] + y[0] * y[1];
Ok(())
}
}
运行代码会产生以下洛伦兹吸引子的可视化
Peroxide 致力于利用 Rust 语言的优点,同时为数值计算和科学模拟提供用户友好的界面。
怎么样?如果还有其他需要我改进的地方,请告诉我!
最新 README 版本
对应于 0.37.7
先决条件
- 针对
O3
功能 - 需要OpenBLAS
- 针对
plot
功能 - 需要matplotlib
以及可选的scienceplots
(用于出版物质量) - 针对
nc
功能 - 需要netcdf
安装
- 在您的项目目录中运行以下命令
-
默认
cargo add peroxide
-
OpenBLAS
cargo add peroxide --features O3
-
绘图
cargo add peroxide --features plot
-
DataFrame 的 NetCDF 依赖项
cargo add peroxide --features nc
-
DataFrame 的 CSV 依赖项
cargo add peroxide --features csv
-
DataFrame 的 Parquet 依赖项
cargo add peroxide --features parquet
-
使用矩阵或多项式进行序列化或反序列化
cargo add peroxide --features serde
-
所有功能
cargo add peroxide --features "O3 plot nc csv parquet serde"
功能使用技巧
-
如果您想使用 QR,SVD 或 Cholesky 分解,您应使用
O3
功能。这些分解在default
功能中未实现。 -
如果您想保存您的数值结果,请考虑使用
parquet
或nc
功能,分别对应于parquet
和netcdf
文件格式。这些格式比csv
和json
要高效得多。 -
对于绘图,建议使用
plot
功能。但是,如果您需要更多的自定义,您可以使用parquet
或nc
功能将您的数据导出为 parquet 或 netcdf 格式,然后使用 Python 创建图表。-
要在 Python 中读取 parquet 文件,您可以使用
pandas
和pyarrow
库。 -
可以在 Socialst 存储库中找到与 netcdf 文件一起工作的 Python 代码模板。
-
模块结构
- src
- lib.rs :
mod
和re-export
- fuga : 用于控制数值算法的 Fuga。
- macros : 宏文件
- julia_macro.rs : 类似 Julia 的宏
- matlab_macro.rs : 类似 MATLAB 的宏
- mod.rs
- r_macro.rs : 类似 R 的宏
- ml : 用于机器学习(Beta)
- numerical : 进行数值计算
- mod.rs
- eigen.rs : 特征值、特征向量算法
- integral.rs : 数值积分
- interp.rs : 插值
- newton.rs : 牛顿法
- ode.rs : 主 ODE 求解器,具有各种算法
- optimize.rs : 非线性回归
- root.rs : 求根
- spline.rs : 三次样条、三次 Hermite 样条 & B 样条
- utils.rs : 用于执行数值操作的工具(例如,雅可比矩阵)
- prelude : 简单使用的序言
- mod.rs
- simpler.rs : 提供更简单的API
- special : 使用纯Rust编写的特殊函数(
puruspe
的包装器)- mod.rs
- function.rs : 特殊函数
- statistics : 统计工具
- structure : 基本数据结构
- mod.rs
- ad.rs : 自动微分
- dataframe.rs : 数据帧
- matrix.rs : 矩阵
- polynomial.rs : 多项式
- sparse.rs : 用于稀疏结构(Beta)
- vector.rs :
Vec<f64>
的额外工具
- traits
- mod.rs
- fp.rs : 函数式编程工具箱
- general.rs : 通用算法
- math.rs : 数学
- mutable.rs : 可变工具箱
- num.rs : 数量,实数和更多操作
- pointer.rs : 方便的矩阵指针和向量指针
- stable.rs : 在稳定版中实现nightly-only功能
- sugar.rs : 向量的语法糖
- util
- mod.rs
- api.rs : 用于各种语言风格的矩阵构造函数
- low_level.rs : 低级工具
- non_macro.rs : 宏的原始版本
- plot.rs : 绘制图表(使用
pyo3
) - print.rs : 便于打印
- useful.rs : 用于实现库的有用工具
- wrapper.rs : 其他crate的包装器(例如,rand)
- writer.rs : 更方便的写入系统
- lib.rs :
文档
示例
-
在examples目录中,有一些示例。
-
在测试目录下,有一些有用的测试。
-
更多示例请参阅Peroxide 图库。
发布信息
贡献指南
许可协议
Peroxide 采用双重许可 - Apache License 2.0 和 MIT License。
待办事项
查看TODO.md
引用Peroxide
嘿!如果你在研究或项目中使用了Peroxide,你不必引用我们。但如果你这样做,我们会非常感激!😊
为了让引用Peroxide变得简单,我们已经在Zenodo上创建了一个DOI。只需点击这个徽章
这将带你到Peroxide的Zenodo页面。在底部,你可以找到各种格式的引用信息,如BibTeX、RIS和APA。
所以,如果你想承认我们在Peroxide上所做的努力,引用我们将是一个很好的方式!感谢你的考虑,我们非常感谢你的支持!👍
依赖项
~3–16MB
~252K SLoC