use crate::error::{IntegrateError, IntegrateResult, Result};
use scirs2_core::ndarray::{Array1, Array2};
use scirs2_core::numeric::Complex64;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct BifurcationPoint {
pub parameter_value: f64,
pub state: Array1<f64>,
pub bifurcation_type: BifurcationType,
pub eigenvalues: Vec<Complex64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum BifurcationType {
Fold,
Transcritical,
Pitchfork,
Hopf,
PeriodDoubling,
Homoclinic,
Unknown,
Cusp,
TakensBogdanov,
Bautin,
ZeroHopf,
DoubleHopf,
}
#[derive(Debug, Clone)]
pub struct StabilityResult {
pub fixed_points: Vec<FixedPoint>,
pub periodic_orbits: Vec<PeriodicOrbit>,
pub lyapunov_exponents: Option<Array1<f64>>,
pub basin_analysis: Option<BasinAnalysis>,
}
#[derive(Debug, Clone)]
pub struct FixedPoint {
pub location: Array1<f64>,
pub stability: StabilityType,
pub eigenvalues: Vec<Complex64>,
pub eigenvectors: Array2<Complex64>,
}
#[derive(Debug, Clone)]
pub struct PeriodicOrbit {
pub representative_point: Array1<f64>,
pub period: f64,
pub stability: StabilityType,
pub floquet_multipliers: Vec<Complex64>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StabilityType {
Stable,
Unstable,
Saddle,
Center,
Degenerate,
SpiralStable,
SpiralUnstable,
NodeStable,
NodeUnstable,
Marginally,
}
#[derive(Debug, Clone)]
pub struct BasinAnalysis {
pub grid_points: Array2<f64>,
pub attractor_indices: Array2<i32>,
pub attractors: Vec<Array1<f64>>,
}
#[derive(Debug, Clone)]
pub struct TwoParameterBifurcationResult {
pub parameter_grid: Array2<f64>,
pub stability_map: Array2<f64>,
pub bifurcation_curves: Vec<BifurcationCurve>,
pub parameter_range_1: (f64, f64),
pub parameter_range_2: (f64, f64),
}
#[derive(Debug, Clone)]
pub struct BifurcationCurve {
pub points: Vec<(f64, f64)>,
pub curve_type: BifurcationType,
}
#[derive(Debug, Clone)]
pub struct ContinuationResult {
pub solution_branch: Vec<Array1<f64>>,
pub parameter_values: Vec<f64>,
pub converged: bool,
pub final_residual: f64,
}
#[derive(Debug, Clone)]
pub struct SensitivityAnalysisResult {
pub first_order_sensitivities: HashMap<String, Array1<f64>>,
pub parameter_interactions: HashMap<(String, String), Array1<f64>>,
pub nominal_parameters: HashMap<String, f64>,
pub nominal_state: Array1<f64>,
}
#[derive(Debug, Clone)]
pub struct NormalFormResult {
pub normal_form_coefficients: Array1<f64>,
pub transformation_matrix: Array2<f64>,
pub normal_form_type: BifurcationType,
pub stability_analysis: String,
}