extern crate rand;
pub use self::rand::prelude::*;
#[macro_export]
macro_rules! c {
( $( $x:expr ),* ) => {
{
let mut v: Vec<f64> = Vec::new();
let mut l: usize = 0;
$(
v.push($x as f64);
l += 1;
)*
v
}
};
( $( $x:expr );* ) => {
{
let mut v: Vec<f64> = Vec::new();
$(
v.extend(&$x);
)*
v
}
}
}
#[macro_export]
macro_rules! seq {
( $start:expr, $end:expr, $step:expr ) => {{
let s = $start as f64;
let e = $end as f64;
let step = $step as f64;
assert!(e > s);
let factor: f64 = (e - s) / step;
let l: usize = factor as usize + 1;
let mut v: Vec<f64> = Vec::new();
for i in 0..l {
v.push(s + step * (i as f64));
}
v
}};
( $start:expr; $end:expr; $step:expr ) => {
seq!($start, $end, $step)
};
}
#[macro_export]
macro_rules! matrix {
( $start:expr;$end:expr;$step:expr, $row:expr, $col:expr, $shape:expr ) => {{
matrix(seq!($start, $end, $step), $row, $col, $shape)
}};
( $value:expr, $row:expr, $col:expr, $shape:expr ) => {{
matrix(vec![$value as f64; $row * $col], $row, $col, $shape)
}};
}
#[macro_export]
macro_rules! cbind {
( $x:expr, $y:expr ) => {
{
let mut temp = $x;
if temp.shape != Col {
temp = temp.change_shape();
}
let mut v: Vec<f64> = temp.data;
let mut c: usize = temp.col;
let r: usize = temp.row;
assert_eq!(r, $y.row);
v.extend(&$y.data.clone());
c += &$y.col;
matrix(v, r, c, Col)
}
};
( $x0:expr, $( $x: expr ),* ) => {
{
let mut temp0 = $x0;
if temp0.shape != Col {
temp0 = temp0.change_shape();
}
let mut v: Vec<f64> = temp0.data;
let mut c: usize = temp0.col;
let r: usize = temp0.row;
$(
let mut temp = $x;
if temp.shape != Col {
temp = temp.change_shape();
}
assert_eq!(r, temp.row);
c += temp.col;
v.extend(&temp.data.clone());
)*
matrix(v, r, c, Col)
}
};
}
#[macro_export]
macro_rules! rbind {
( $x:expr, $y:expr ) => {
{
let mut temp = $x;
if temp.shape != Row {
temp = temp.change_shape();
}
let mut temp2 = $y;
if temp2.shape != Row {
temp2 = temp2.change_shape();
}
let mut v: Vec<f64> = temp.data;
let c: usize = temp.col;
let mut r: usize = temp.row;
assert_eq!(c, temp2.col);
v.extend(&temp2.data.clone());
r += temp2.row;
matrix(v, r, c, Row)
}
};
( $x0:expr, $( $x: expr ),* ) => {
{
let mut temp0 = $x0;
if temp0.shape != Row {
temp0 = temp0.change_shape();
}
let mut v: Vec<f64> = temp0.data;
let c: usize = temp0.col;
let mut r: usize = temp0.row;
$(
let mut temp = $x;
if temp.shape != Row {
temp = temp.change_shape();
}
assert_eq!(c, temp.col);
r += temp.row;
v.extend(&temp.data.clone());
)*
matrix(v, r, c, Row)
}
};
}
#[macro_export]
macro_rules! runif {
( $x0:expr, $start:expr, $end:expr ) => {{
let n: usize = $x0;
let mut v = vec![0f64; n];
let mut rng = thread_rng();
for i in 0..n {
v[i] = rng.gen_range($start as f64, $end as f64);
}
v
}};
( $x0:expr ) => {{
runif!($x0, 0, 1)
}};
}
#[macro_export]
macro_rules! rnorm {
( $n:expr, $mean:expr, $sd:expr ) => {{
let n: usize = $n;
let normal = Normal($mean as f64, $sd as f64);
normal.sample(n)
}};
( $n:expr ) => {{
rnorm!($n, 0, 1)
}};
}
#[macro_export]
macro_rules! dnorm {
( $x:expr, $mean: expr, $sd:expr ) => {{
let x = $x as f64;
let mean = $mean as f64;
let sd = $sd as f64;
let normal = Normal(mean, sd);
normal.pdf(x)
}};
( $x:expr ) => {{
dnorm!($x, 0, 1)
}};
}
#[macro_export]
macro_rules! pnorm {
( $x:expr, $mean:expr, $sd:expr ) => {{
let x = $x as f64;
let mean = $mean as f64;
let sd = $sd as f64;
let normal = Normal(mean, sd);
normal.cdf(x)
}};
( $x:expr ) => {
pnorm!($x, 0, 1)
}
}
#[macro_export]
macro_rules! rt {
( $n:expr, $df:expr ) => {{
let n: usize = $n;
let t = StudentT($df as f64);
t.sample(n)
}};
}
#[macro_export]
macro_rules! dt {
( $x:expr, $df:expr ) => {{
let x = $x as f64;
let df = $df as f64;
let t = StudentT(df);
t.pdf(x)
}};
}
#[macro_export]
macro_rules! pt {
( $x:expr, $df:expr ) => {{
let x = $x as f64;
let df = $df as f64;
let t = StudentT(df);
t.cdf(x)
}};
}
#[macro_export]
macro_rules! lm {
( $y:tt ~ $x:tt ) => {
lm(&$x, &$y)
};
}