use crate::generators::probabilistic;
use crate::generators::probabilistic::Sampling;
use crate::messages::errors;
fn gbm_return_valid_inputs(
s0: &f64,
sigma: &f64,
dt: &f64,
n: &usize,
) -> Result<(), errors::GeneratorError> {
match dt.is_sign_positive() && sigma >= &0.0 && s0 >= &0.0 && dt > &0.0 && n > &0 {
true => Ok(()),
false => Err(errors::GeneratorError::GeneratorInputTypeFailure),
}
}
pub fn gbm_return(
s0: f64,
mu: f64,
sigma: f64,
dt: f64,
n: usize,
) -> Result<Vec<f64>, errors::GeneratorError> {
match gbm_return_valid_inputs(&s0, &sigma, &dt, &n) {
Ok(()) => {
let dis = probabilistic::NormalDistribution {
mu: 0.0,
sigma: dt.sqrt(),
};
if n == 1 {
let dwt = dis.sample(n as usize)[0];
let drift = mu * s0 * dt;
let diffusion = sigma * s0 * dwt;
let dst = drift + diffusion;
Ok(vec![dst])
} else {
let dwt: Vec<f64> = dis.sample(n).clone().into_iter().collect();
let mut v_ds = vec![];
let mut v_s = vec![s0];
for t in 0..dwt.len() {
let drift = mu * v_s[t] * dt;
let diffusion = sigma * v_s[t] * dwt[t];
let ds = drift + diffusion;
v_s.push(v_s[t] + ds);
v_ds.push(ds);
}
Ok(v_ds)
}
}
Err(e) => Err(errors::GeneratorError::GeneratorInputTypeFailure),
_ => Err(errors::GeneratorError::GeneratorUndefinedError),
}
}