use super::{output::BvpSciOutputPolicy, singular::BvpSciSingularTerm};
use crate::symbolic::bvp::telemetry::BvpLambdifyExecutionPolicy;
pub type BvpSciExecutionPolicy = BvpLambdifyExecutionPolicy;
pub const SCIPY_MAX_JACOBIAN_REFRESHES: usize = 4;
pub const SCIPY_MAX_NEWTON_ITERATIONS: usize = 8;
pub const SCIPY_MAX_MESH_ITERATIONS: usize = 10;
pub const SCIPY_MAX_BACKTRACKING_TRIALS: usize = 4;
pub const SCIPY_ARMIJO_SIGMA: f64 = 0.2;
pub const SCIPY_BACKTRACKING_TAU: f64 = 0.5;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BvpSciExecution {
Numerical,
Lambdify,
Aot,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BvpSciAssembly {
Numerical,
ExprLegacy,
AtomViewNative,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BvpSciMatrixLayout {
Dense,
Sparse,
Banded { lower: usize, upper: usize },
}
#[derive(Clone, Debug)]
pub struct BvpSciOptions {
pub execution: BvpSciExecution,
pub assembly: Option<BvpSciAssembly>,
pub matrix_layout: BvpSciMatrixLayout,
pub tolerance: f64,
pub boundary_tolerance: Option<f64>,
pub max_nodes: usize,
pub max_newton_iterations: usize,
pub max_jacobian_refreshes: usize,
pub max_mesh_refinements: usize,
pub max_backtracking_steps: usize,
pub telemetry: super::telemetry::BvpSciTelemetryMode,
pub execution_policy: BvpSciExecutionPolicy,
pub output_policy: BvpSciOutputPolicy,
pub singular_term: Option<BvpSciSingularTerm>,
}
impl Default for BvpSciOptions {
fn default() -> Self {
Self {
execution: BvpSciExecution::Numerical,
assembly: None,
matrix_layout: BvpSciMatrixLayout::Dense,
tolerance: 1e-3,
boundary_tolerance: None,
max_nodes: 1_000,
max_newton_iterations: SCIPY_MAX_NEWTON_ITERATIONS,
max_jacobian_refreshes: SCIPY_MAX_JACOBIAN_REFRESHES,
max_mesh_refinements: SCIPY_MAX_MESH_ITERATIONS,
max_backtracking_steps: SCIPY_MAX_BACKTRACKING_TRIALS,
telemetry: super::telemetry::BvpSciTelemetryMode::Off,
execution_policy: BvpSciExecutionPolicy::Sequential,
output_policy: BvpSciOutputPolicy::MeshAndValues,
singular_term: None,
}
}
}
impl BvpSciOptions {
pub fn with_execution(mut self, execution: BvpSciExecution) -> Self {
self.execution = execution;
self
}
pub fn with_assembly(mut self, assembly: BvpSciAssembly) -> Self {
self.assembly = Some(assembly);
self
}
pub fn with_matrix_layout(mut self, matrix_layout: BvpSciMatrixLayout) -> Self {
self.matrix_layout = matrix_layout;
self
}
pub fn with_tolerance(mut self, tolerance: f64) -> Self {
self.tolerance = tolerance;
self
}
pub fn with_boundary_tolerance(mut self, tolerance: f64) -> Self {
self.boundary_tolerance = Some(tolerance);
self
}
pub fn with_limits(
mut self,
max_nodes: usize,
max_newton_iterations: usize,
max_mesh_refinements: usize,
) -> Self {
self.max_nodes = max_nodes;
self.max_newton_iterations = max_newton_iterations;
self.max_mesh_refinements = max_mesh_refinements;
self
}
pub fn with_backtracking_limit(mut self, max_backtracking_steps: usize) -> Self {
self.max_backtracking_steps = max_backtracking_steps;
self
}
pub fn with_execution_policy(mut self, policy: BvpSciExecutionPolicy) -> Self {
self.execution_policy = policy;
self
}
pub fn with_telemetry(mut self, telemetry: super::telemetry::BvpSciTelemetryMode) -> Self {
self.telemetry = telemetry;
self
}
pub fn with_output_policy(mut self, output_policy: BvpSciOutputPolicy) -> Self {
self.output_policy = output_policy;
self
}
pub fn with_singular_term(mut self, singular_term: BvpSciSingularTerm) -> Self {
self.singular_term = Some(singular_term);
self
}
}