use crate::error::SimulationError;
use crate::simulation::{WalkParams, WalkTypeAble};
use positive::Positive;
use std::convert::TryInto;
use std::fmt::Display;
use std::ops::AddAssign;
#[derive(Clone)]
pub(crate) struct RampWalker {
pub delta: Positive,
}
impl RampWalker {
fn ramp<X, Y>(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError>
where
X: Copy + TryInto<Positive> + AddAssign + Display,
Y: TryInto<Positive> + Display + Clone,
{
let start = params.ystep_as_positive()?;
Ok((0..params.size)
.map(|i| start + self.delta * i as f64)
.collect())
}
}
impl<X, Y> WalkTypeAble<X, Y> for RampWalker
where
X: Copy + TryInto<Positive> + AddAssign + Display,
Y: TryInto<Positive> + Display + Clone,
{
fn brownian(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn geometric_brownian(
&self,
params: &WalkParams<X, Y>,
) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn log_returns(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn mean_reverting(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn jump_diffusion(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn garch(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn heston(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn custom(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
fn telegraph(&self, params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
self.ramp(params)
}
}
#[derive(Clone)]
pub(crate) struct EmptyWalker;
impl<X, Y> WalkTypeAble<X, Y> for EmptyWalker
where
X: Copy + TryInto<Positive> + AddAssign + Display,
Y: TryInto<Positive> + Display + Clone,
{
fn brownian(&self, _params: &WalkParams<X, Y>) -> Result<Vec<Positive>, SimulationError> {
Ok(Vec::new())
}
fn geometric_brownian(
&self,
_params: &WalkParams<X, Y>,
) -> Result<Vec<Positive>, SimulationError> {
Ok(Vec::new())
}
}