#Numeric #R #MATLAB #Python #Scientific

bin+lib peroxide

Rust numeric library contains linear algebra, numerical analysis, statistics and machine learning tools with R, MATLAB, Python like macros

76 releases (8 breaking)

0.9.1 Apr 14, 2019
0.8.13 Apr 1, 2019
0.8.12 Mar 31, 2019
0.6.11 Dec 31, 2018
0.6.6 Nov 29, 2018

#5 in Science

Download history 58/week @ 2018-12-29 125/week @ 2019-01-05 73/week @ 2019-01-12 93/week @ 2019-01-19 11/week @ 2019-01-26 26/week @ 2019-02-02 28/week @ 2019-02-09 91/week @ 2019-02-16 4/week @ 2019-02-23 163/week @ 2019-03-02 79/week @ 2019-03-09 16/week @ 2019-03-16 530/week @ 2019-03-23 41/week @ 2019-03-30 107/week @ 2019-04-06

418 downloads per month

BSD-3-Clause

488KB
4.5K SLoC

Peroxide

On crates.io On docs.rs travis
maintenance

Pure Rust numeric library contains linear algebra, numerical analysis, statistics and machine learning tools with R, MATLAB, Python like macros.

Latest README version

Corresponding to 0.8.7.

Install

  • Add next line to your cargo.toml
peroxide = "0.8"

Module Structure

Documentation

There is Peroxide Gitbook

Not yet documentized contents

Polynomial

// Peroxide
extern crate peroxide;
use peroxide::*;

fn main() {
    // Declare polynomial
    let a = poly(c!(1,3,2));
    a.print(); // x^2 + 3x + 2
    a.eval(1); // Evaluate when x = 1 -> 6.0
    
    let b = poly(c!(1,2,3,4));       // x^3 + 2x^2 + 3x + 4
    (a.clone() + b.clone()).print(); // x^3 + 3x^2 + 6x + 6
    (a.clone() - b.clone()).print(); // -x^3 - x^2 - 2
    (a.clone() * b.clone()).print(); // x^5 + 5x^4 + 11x^3 + 17x^2 + 18x + 8
    
    let c = poly(c!(1, -1));
    c.print();                       // x - 1
    c.pow(2).print();                // x^2 - 2x + 1
}

Interpolation (Beta)

  • Lagrange polynomial interpolation
  • Chebyshev nodes
// Peroxide
extern crate peroxide;
use peroxide::*;

fn main() {
    let a = c!(-1, 0, 1);
    let b = c!(1, 0, 1);

    let l = lagrange_polynomial(a, b);
    l.print(); // x^2
}

Spline (Beta)

  • Natural cubic spline
// Peroxide
extern crate peroxide;
use peroxide::*;

fn main() {
    let x = c!(0.9, 1.3, 1.9, 2.1);
    let y = c!(1.3, 1.5, 1.85, 2.1);

    let s = cubic_spline(x, y);

    for i in 0 .. s.len() {
        s[i].print();
    }
    
    // -0.2347x^3 + 0.6338x^2 - 0.0329x + 0.9873
    // 0.9096x^3 - 3.8292x^2 + 5.7691x - 1.5268
    // -2.2594x^3 + 14.2342x^2 - 28.5513x + 20.2094
}

MATLAB like macro

  • zeros - zero vector or matrix
  • eye - identity matrix
  • rand - random matrix (range from 0 to 1)

Automatic Differentiation

  • Implemented AD with dual number structure.
  • Available functions
    • sin, cos, tan
    • pow, powf
    • +,-,x,/
    • exp, ln
extern crate peroxide;
use peroxide::*;

fn main() {
    let a = dual(0, 1); // x at x = 0
    a.sin().print();    // sin(x) at x = 0
    
    // value: 0  // sin(0) = 0
    // slope: 1  // cos(0) = 1
}

Jacobian

  • Implemented by AD - Exact Jacobian
extern crate peroxide;
use peroxide::*;

fn main() {
    let xs = c!(1, 1);
    jacobian(xs, f).print();
    
    //      c[0] c[1]
    // r[0]    6    3
}

// f(t, x) = 3t^2 * x
fn f(xs: Vec<Dual>) -> Vec<Dual> {
    let t = xs[0];
    let x = xs[1];

    vec![t.pow(2) * 3. * x]
}

Ordinary Differential Equation

  • Solve 1st order ODE with various methods
  • Explicit Method
    • RK4: Runge-Kutta 4th order
  • Implicit Method
    • BDF1: Backward Euler
    • GL4: Gauss-Legendre 4th order

Caution

  • input function should have form (Dual, Vec<Dual>) -> Vec<Dual>
// Lotka-Volterra
extern crate peroxide;
use peroxide::*;

fn main() {
    // t = 0, x = 2, y = 1
    let xs = c!(2, 1);
    let rk4_records = solve(lotka_volterra, xs.clone(), (0, 10), 1e-3, RK4);
    let bdf_records = solve(lotka_volterra, xs.clone(), (0, 10), 1e-3, BDF1(1e-15));
    let gl4_records = solve(lotka_volterra, xs, (0, 10), 1e-3, GL4(1e-15));
    //rk4_records.write_with_header("example_data/lotka_rk4.csv", vec!["t", "x", "y"]);
    //bdf_records.write_with_header("example_data/lotka_bdf.csv", vec!["t", "x", "y"]);
    gl4_records.write_with_header("example_data/lotka_gl4.csv", vec!["t", "x", "y"]);
}

fn lotka_volterra(_t: Dual, xs: Vec<Dual>) -> Vec<Dual> {
    let a = 4.;
    let c = 1.;

    let x = xs[0];
    let y = xs[1];

    vec![
        a * (x - x*y),
        -c * (y - x*y)
    ]
}

Version Info

To see RELEASES.md

TODO

To see TODO.md

Dependencies

~3.5MB
~49K SLoC