1use crate::analysis::BifurcationPoint;
6use scirs2_core::ndarray::{Array1, Array2, Array3};
7use std::collections::HashMap;
8
9#[derive(Debug, Clone)]
11pub struct PhaseSpacePlot {
12 pub x: Vec<f64>,
14 pub y: Vec<f64>,
16 pub colors: Option<Vec<f64>>,
18 pub metadata: PlotMetadata,
20}
21
22#[derive(Debug, Clone)]
24pub struct BifurcationDiagram {
25 pub parameters: Vec<f64>,
27 pub states: Vec<Vec<f64>>,
29 pub stability: Vec<bool>,
31 pub bifurcation_points: Vec<BifurcationPoint>,
33}
34
35#[derive(Debug, Clone)]
37pub struct PlotMetadata {
38 pub title: String,
40 pub xlabel: String,
42 pub ylabel: String,
44 pub annotations: HashMap<String, String>,
46}
47
48impl Default for PlotMetadata {
49 fn default() -> Self {
50 Self {
51 title: "Numerical Integration Result".to_string(),
52 xlabel: "X".to_string(),
53 ylabel: "Y".to_string(),
54 annotations: HashMap::new(),
55 }
56 }
57}
58
59#[derive(Debug, Clone)]
61pub struct VectorFieldPlot {
62 pub x_grid: Array2<f64>,
64 pub y_grid: Array2<f64>,
66 pub u: Array2<f64>,
68 pub v: Array2<f64>,
70 pub magnitude: Array2<f64>,
72 pub metadata: PlotMetadata,
74}
75
76#[derive(Debug, Clone)]
78pub struct HeatMapPlot {
79 pub x: Array1<f64>,
81 pub y: Array1<f64>,
83 pub z: Array2<f64>,
85 pub metadata: PlotMetadata,
87}
88
89#[derive(Debug, Clone)]
91pub struct SurfacePlot {
92 pub x: Array2<f64>,
94 pub y: Array2<f64>,
96 pub z: Array2<f64>,
98 pub metadata: PlotMetadata,
100}
101
102#[derive(Debug, Clone, Copy)]
104pub enum OutputFormat {
105 ASCII,
107 CSV,
109 JSON,
111 SVG,
113}
114
115#[derive(Debug, Clone, Copy)]
117pub enum ColorScheme {
118 Viridis,
120 Plasma,
122 Inferno,
124 Grayscale,
126}
127
128#[derive(Debug, Clone)]
130pub struct PlotStatistics {
131 pub count: usize,
132 pub mean: f64,
133 pub std_dev: f64,
134 pub min: f64,
135 pub max: f64,
136 pub median: f64,
137}
138
139#[derive(Debug, Clone)]
141pub struct ParameterExplorationPlot {
142 pub x_grid: Array2<f64>,
144 pub y_grid: Array2<f64>,
146 pub z_values: Array2<f64>,
148 pub param_ranges: Vec<(f64, f64)>,
150 pub param_names: Vec<String>,
152 pub metadata: PlotMetadata,
154}
155
156#[derive(Debug, Clone, PartialEq)]
158pub enum AttractorStability {
159 FixedPoint,
161 PeriodTwo,
163 Periodic(usize),
165 QuasiPeriodic,
167 Chaotic,
169 Unknown,
171}
172
173#[derive(Debug, Clone)]
175pub struct RealTimeBifurcationPlot {
176 pub parameter_values: Vec<f64>,
178 pub attractor_data: Vec<Vec<Vec<f64>>>,
180 pub stability_data: Vec<Vec<AttractorStability>>,
182 pub parameter_range: (f64, f64),
184 pub metadata: PlotMetadata,
186}
187
188#[derive(Debug, Clone)]
190pub struct PhaseSpace3D {
191 pub x: Vec<f64>,
193 pub y: Vec<f64>,
195 pub z: Vec<f64>,
197 pub colors: Option<Vec<f64>>,
199 pub metadata: PlotMetadata,
201}
202
203#[derive(Debug, Clone)]
205pub struct SensitivityPlot {
206 pub parameter_names: Vec<String>,
208 pub sensitivities: Vec<f64>,
210 pub base_parameters: Vec<f64>,
212 pub base_value: f64,
214 pub metadata: PlotMetadata,
216}
217
218#[derive(Debug, Clone)]
220pub struct InteractivePlotControls {
221 pub zoom: f64,
223 pub pan_offset: (f64, f64),
225 pub selected_ranges: Vec<(f64, f64)>,
227 pub current_frame: usize,
229 pub animation_speed: f64,
231 pub visibility_flags: std::collections::HashMap<String, bool>,
233}
234
235#[derive(Debug, Clone, Copy)]
237pub enum ExplorationMethod {
238 GridScan,
240 RandomSampling,
242 AdaptiveSampling,
244 GradientGuided,
246}
247
248#[derive(Debug, Clone)]
250pub struct ParameterRegion {
251 pub center: Array1<f64>,
253 pub radius: f64,
255}
256
257#[derive(Debug, Clone)]
259pub struct ParameterExplorationResult {
260 pub exploration_points: Vec<Array1<f64>>,
262 pub response_values: Vec<Array1<f64>>,
264 pub parameter_grid: Vec<Array1<f64>>,
266 pub convergence_history: Vec<Array1<f64>>,
268 pub exploration_method: ExplorationMethod,
270 pub optimization_metrics: ExplorationMetrics,
272}
273
274#[derive(Debug, Clone)]
276pub struct ExplorationMetrics {
277 pub max_response_norm: f64,
279 pub min_response_norm: f64,
281 pub mean_response_norm: f64,
283 pub response_variance: f64,
285 pub coverage_efficiency: f64,
287}
288
289#[derive(Debug, Clone)]
291pub struct AttractorInfo {
292 pub representative_states: Vec<f64>,
294 pub is_stable: bool,
296 pub period: usize,
298}
299
300#[derive(Debug, Clone, Copy)]
302pub enum DimensionReductionMethod {
303 PCA,
305 TSNE,
307 UMAP,
309 LDA,
311 MDS,
313}
314
315#[derive(Debug, Clone, Copy)]
317pub enum ClusteringMethod {
318 KMeans { k: usize },
320 DBSCAN { eps: f64, min_samples: usize },
322 Hierarchical { n_clusters: usize },
324 None,
326}
327
328#[derive(Debug, Clone)]
330pub struct HighDimensionalPlot {
331 pub x: Vec<f64>,
333 pub y: Vec<f64>,
335 pub z: Option<Vec<f64>>,
337 pub colors: Vec<f64>,
339 pub cluster_labels: Option<Vec<usize>>,
341 pub original_dimensions: usize,
343 pub reduced_dimensions: usize,
345 pub reduction_method: DimensionReductionMethod,
347 pub metadata: PlotMetadata,
349}
350
351#[derive(Debug, Clone)]
353pub struct AnimationSettings {
354 pub fps: f64,
356 pub loop_animation: bool,
358 pub interpolate_frames: bool,
360 pub trail_length: usize,
362}
363
364impl Default for AnimationSettings {
365 fn default() -> Self {
366 Self {
367 fps: 30.0,
368 loop_animation: true,
369 interpolate_frames: false,
370 trail_length: 50,
371 }
372 }
373}
374
375#[derive(Debug, Clone)]
377pub struct FluidState {
378 pub velocity: Vec<Array2<f64>>,
380 pub pressure: Array2<f64>,
382 pub temperature: Option<Array2<f64>>,
384 pub time: f64,
386 pub dx: f64,
388 pub dy: f64,
390}
391
392#[derive(Debug, Clone)]
394pub struct FluidState3D {
395 pub velocity: Vec<Array3<f64>>,
397 pub pressure: Array3<f64>,
399 pub temperature: Option<Array3<f64>>,
401 pub time: f64,
403 pub dx: f64,
405 pub dy: f64,
407 pub dz: f64,
409}
410
411#[derive(Debug, Clone)]
413pub struct ErrorVisualizationOptions {
414 pub show_absolute: bool,
416 pub show_relative: bool,
418 pub show_distribution: bool,
420 pub show_convergence: bool,
422 pub error_threshold: f64,
424}
425
426impl Default for ErrorVisualizationOptions {
427 fn default() -> Self {
428 Self {
429 show_absolute: true,
430 show_relative: true,
431 show_distribution: true,
432 show_convergence: true,
433 error_threshold: 1e-6,
434 }
435 }
436}
437
438#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
440pub enum ErrorType {
441 Absolute,
443 Relative,
445 Truncation,
447 Roundoff,
449 Discretization,
451}
452
453#[derive(Debug, Clone)]
455pub struct ErrorDistributionPlot {
456 pub bin_centers: Array1<f64>,
458 pub histogram: Array1<f64>,
460 pub error_type: ErrorType,
462 pub statistics: ErrorStatistics,
464 pub color_scheme: ColorScheme,
466}
467
468#[derive(Debug, Clone)]
470pub struct ErrorStatistics {
471 pub mean: f64,
473 pub std_dev: f64,
475 pub min: f64,
477 pub max: f64,
479 pub median: f64,
481 pub percentile_95: f64,
483}
484
485#[derive(Debug, Clone)]
487pub struct ConvergencePlot {
488 pub iterations: Array1<f64>,
489 pub residuals: Array1<f64>,
490 pub convergence_iteration: Option<usize>,
491 pub convergence_rate: f64,
492 pub theoretical_line: Option<Array1<f64>>,
493 pub algorithm_name: String,
494 pub tolerance_line: f64,
495}
496
497#[derive(Debug, Clone)]
499pub struct MultiMetricConvergencePlot {
500 pub iterations: Array1<f64>,
501 pub curves: Vec<ConvergenceCurve>,
502 pub convergence_rates: Vec<(String, f64)>,
503 pub tolerance_line: f64,
504}
505
506#[derive(Debug, Clone)]
508pub struct ConvergenceCurve {
509 pub name: String,
510 pub data: Array1<f64>,
511 pub convergence_rate: f64,
512 pub color: [f64; 3],
513}
514
515#[derive(Debug, Clone)]
517pub struct StepSizeAnalysisPlot {
518 pub log_step_sizes: Array1<f64>,
519 pub log_errors: Array1<f64>,
520 pub theoretical_errors: Option<Array1<f64>>,
521 pub order_of_accuracy: f64,
522 pub method_name: String,
523}
524
525#[derive(Debug, Clone)]
527pub struct PhaseDensityPlot {
528 pub x_grid: Array1<f64>,
529 pub y_grid: Array1<f64>,
530 pub density_grid: Array2<f64>,
531 pub x_bounds: (f64, f64),
532 pub y_bounds: (f64, f64),
533 pub n_points: usize,
534}