use crate::methods::finitedifferences::meshers::FdmMesher;
use crate::methods::finitedifferences::stepconditions::FdmStepConditionComposite;
use crate::methods::finitedifferences::utilities::{
FdmBoundaryConditionSet, FdmInnerValueCalculator,
};
use crate::shared::Shared;
use crate::types::{Size, Time};
#[derive(Clone)]
pub struct FdmSolverDesc {
pub mesher: Shared<dyn FdmMesher>,
pub bc_set: FdmBoundaryConditionSet,
pub condition: Shared<FdmStepConditionComposite>,
pub calculator: Shared<dyn FdmInnerValueCalculator>,
pub maturity: Time,
pub time_steps: Size,
pub damping_steps: Size,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::instruments::CashOrNothingPayoff;
use crate::methods::finitedifferences::schemes::testops;
use crate::methods::finitedifferences::utilities::fdm_log_inner_value;
use crate::option::OptionType::Put;
use crate::payoff::Payoff;
use crate::shared::shared;
#[test]
fn a_descriptor_is_built_from_the_ported_types_and_clones() {
let mesher = testops::mesher();
let payoff = shared(CashOrNothingPayoff::new(Put, 100.0, 10.0)) as Shared<dyn Payoff>;
let desc = FdmSolverDesc {
mesher: Shared::clone(&mesher),
bc_set: Vec::new(),
condition: shared(FdmStepConditionComposite::new(&[], Vec::new())),
calculator: shared(fdm_log_inner_value(payoff, mesher, 0)),
maturity: 0.75,
time_steps: 25,
damping_steps: 3,
};
let copy = desc.clone();
assert_eq!(copy.maturity, 0.75);
assert_eq!(copy.time_steps, 25);
assert_eq!(copy.damping_steps, 3);
assert!(copy.bc_set.is_empty());
assert!(copy.condition.stopping_times().is_empty());
}
}