pub struct DampedSolverBuildRequest {
pub eq_system: Vec<Expr>,
pub values: Vec<String>,
pub param_names: Option<Vec<String>>,
pub param_values: Option<Vec<f64>>,
pub arg: String,
pub t0: f64,
pub n_steps: Option<usize>,
pub h: Option<f64>,
pub mesh: Option<Vec<f64>>,
pub border_conditions: HashMap<String, Vec<(usize, f64)>>,
pub bounds: Option<HashMap<String, (f64, f64)>>,
pub rel_tolerance: Option<HashMap<String, f64>>,
pub scheme: String,
pub method: String,
pub bandwidth: Option<(usize, usize)>,
pub backend_policy: BackendSelectionPolicy,
pub resolver: Option<AotResolver>,
pub aot_execution_policy: AotExecutionPolicy,
pub aot_build_policy: AotBuildPolicy,
pub aot_compile_config: AotCompileConfig,
pub aot_codegen_backend: AotCodegenBackend,
pub aot_c_compiler: Option<String>,
pub aot_chunking_policy: AotChunkingPolicy,
pub atom_optimization_profile: AtomOptimizationProfile,
pub symbolic_assembly_backend: BvpSymbolicAssemblyBackend,
pub matrix_backend_override: Option<MatrixBackend>,
pub banded_linear_solver_config: LinearSolverConfig,
pub lambdify_telemetry_mode: BvpLambdifyTelemetryMode,
pub aot_telemetry_mode: BvpAotTelemetryMode,
pub lambdify_execution_policy: BvpLambdifyExecutionPolicy,
}
impl DampedSolverBuildRequest {
pub fn generate(self) -> Result<DampedGeneratedSolverState, BvpBackendIntegrationError> {
generate_damped_solver_state(
self.eq_system,
self.values,
self.param_names,
self.param_values,
self.arg,
self.t0,
self.n_steps,
self.h,
self.mesh,
self.border_conditions,
self.bounds,
self.rel_tolerance,
self.scheme,
self.method,
self.bandwidth,
self.backend_policy,
self.resolver.as_ref(),
self.aot_execution_policy,
self.aot_build_policy,
self.aot_compile_config,
self.aot_codegen_backend,
self.aot_c_compiler,
self.aot_chunking_policy,
self.atom_optimization_profile,
self.symbolic_assembly_backend,
self.matrix_backend_override,
self.banded_linear_solver_config,
self.lambdify_telemetry_mode,
self.aot_telemetry_mode,
self.lambdify_execution_policy,
)
}
}
pub fn try_build_and_apply_damped_solver_state<T: ApplyDampedGeneratedSolverState>(
target: &mut T,
request: DampedSolverBuildRequest,
context: &str,
) -> Result<(), BvpBackendIntegrationError> {
info!("{context}: generating damped solver state");
match request.generate() {
Ok(state) => {
target.apply_generated_solver_state(state);
info!("{context}: damped solver state applied");
Ok(())
}
Err(err) => {
error!("{context}: {err:?}");
Err(err)
}
}
}
pub fn build_and_apply_damped_solver_state<T: ApplyDampedGeneratedSolverState>(
target: &mut T,
request: DampedSolverBuildRequest,
context: &str,
) {
try_build_and_apply_damped_solver_state(target, request, context)
.unwrap_or_else(|err| panic!("{context}: {err:?}"));
}
pub fn try_generate_and_apply_damped_solver_state<
T: BuildDampedSolverRequest + ApplyDampedGeneratedSolverState,
>(
target: &mut T,
mesh: Option<Vec<f64>>,
bandwidth: Option<(usize, usize)>,
context: &str,
) -> Result<(), BvpBackendIntegrationError> {
let request = target.build_solver_request(mesh, bandwidth);
try_build_and_apply_damped_solver_state(target, request, context)
}
pub fn generate_and_apply_damped_solver_state<
T: BuildDampedSolverRequest + ApplyDampedGeneratedSolverState,
>(
target: &mut T,
mesh: Option<Vec<f64>>,
bandwidth: Option<(usize, usize)>,
context: &str,
) {
try_generate_and_apply_damped_solver_state(target, mesh, bandwidth, context)
.unwrap_or_else(|err| panic!("{context}: {err:?}"));
}
pub struct FrozenSolverBuildRequest {
pub eq_system: Vec<Expr>,
pub values: Vec<String>,
pub arg: String,
pub param_names: Option<Vec<String>>,
pub param_values: Option<Vec<f64>>,
pub t0: f64,
pub n_steps: Option<usize>,
pub h: Option<f64>,
pub mesh: Option<Vec<f64>>,
pub border_conditions: HashMap<String, Vec<(usize, f64)>>,
pub scheme: String,
pub method: String,
pub bandwidth: Option<(usize, usize)>,
pub backend_policy: BackendSelectionPolicy,
pub resolver: Option<AotResolver>,
pub aot_execution_policy: AotExecutionPolicy,
pub aot_build_policy: AotBuildPolicy,
pub aot_compile_config: AotCompileConfig,
pub aot_codegen_backend: AotCodegenBackend,
pub aot_c_compiler: Option<String>,
pub aot_chunking_policy: AotChunkingPolicy,
pub atom_optimization_profile: AtomOptimizationProfile,
pub symbolic_assembly_backend: BvpSymbolicAssemblyBackend,
pub matrix_backend_override: Option<MatrixBackend>,
pub banded_linear_solver_config: LinearSolverConfig,
pub lambdify_telemetry_mode: BvpLambdifyTelemetryMode,
pub aot_telemetry_mode: BvpAotTelemetryMode,
pub lambdify_execution_policy: BvpLambdifyExecutionPolicy,
}
impl FrozenSolverBuildRequest {
pub fn generate(self) -> Result<FrozenGeneratedSolverState, BvpBackendIntegrationError> {
generate_frozen_solver_state(
self.eq_system,
self.values,
self.arg,
self.param_names,
self.param_values,
self.t0,
self.n_steps,
self.h,
self.mesh,
self.border_conditions,
self.scheme,
self.method,
self.bandwidth,
self.backend_policy,
self.resolver.as_ref(),
self.aot_execution_policy,
self.aot_build_policy,
self.aot_compile_config,
self.aot_codegen_backend,
self.aot_c_compiler,
self.aot_chunking_policy,
self.atom_optimization_profile,
self.symbolic_assembly_backend,
self.matrix_backend_override,
self.banded_linear_solver_config,
self.lambdify_telemetry_mode,
self.aot_telemetry_mode,
self.lambdify_execution_policy,
)
}
}
pub fn try_build_and_apply_frozen_solver_state<T: ApplyFrozenGeneratedSolverState>(
target: &mut T,
request: FrozenSolverBuildRequest,
context: &str,
) -> Result<(), BvpBackendIntegrationError> {
info!("{context}: generating frozen solver state");
match request.generate() {
Ok(state) => {
target.apply_generated_solver_state(state);
info!("{context}: frozen solver state applied");
Ok(())
}
Err(err) => {
error!("{context}: {err:?}");
Err(err)
}
}
}
pub fn build_and_apply_frozen_solver_state<T: ApplyFrozenGeneratedSolverState>(
target: &mut T,
request: FrozenSolverBuildRequest,
context: &str,
) {
try_build_and_apply_frozen_solver_state(target, request, context)
.unwrap_or_else(|err| panic!("{context}: {err:?}"));
}
pub fn try_generate_and_apply_frozen_solver_state<
T: BuildFrozenSolverRequest + ApplyFrozenGeneratedSolverState,
>(
target: &mut T,
context: &str,
) -> Result<(), BvpBackendIntegrationError> {
let request = target.build_solver_request();
try_build_and_apply_frozen_solver_state(target, request, context)
}
pub fn generate_and_apply_frozen_solver_state<
T: BuildFrozenSolverRequest + ApplyFrozenGeneratedSolverState,
>(
target: &mut T,
context: &str,
) {
try_generate_and_apply_frozen_solver_state(target, context)
.unwrap_or_else(|err| panic!("{context}: {err:?}"));
}