use std::collections::HashMap;
use ndarray::{Array1, Array2};
#[derive(Debug, Clone)]
pub struct ModeTable {
pub frequency: Array1<f64>,
pub damping: Array1<f64>,
pub wavelength: Array1<f64>,
pub magnitude: Array1<f64>,
}
impl ModeTable {
pub fn empty() -> Self {
Self {
frequency: Array1::zeros(0),
damping: Array1::zeros(0),
wavelength: Array1::zeros(0),
magnitude: Array1::zeros(0),
}
}
pub fn len(&self) -> usize {
self.frequency.len()
}
pub fn is_empty(&self) -> bool {
self.frequency.is_empty()
}
pub fn to_array(&self) -> Array2<f64> {
let n = self.len();
let mut out = Array2::<f64>::zeros((n, 4));
out.column_mut(0).assign(&self.frequency);
out.column_mut(1).assign(&self.damping);
out.column_mut(2).assign(&self.wavelength);
out.column_mut(3).assign(&self.magnitude);
out
}
pub fn to_map(&self) -> HashMap<String, Array1<f64>> {
HashMap::from([
("Frequency".to_string(), self.frequency.clone()),
("Damping".to_string(), self.damping.clone()),
("Wavelength".to_string(), self.wavelength.clone()),
("Magnitude".to_string(), self.magnitude.clone()),
])
}
}
#[derive(Debug, Clone)]
pub struct Peaks {
pub wavelength: Array1<f64>,
pub frequency: Array1<f64>,
pub magnitude: Array1<f64>,
pub scale_idx: Option<Array1<usize>>,
pub freq_idx: Option<Array1<usize>>,
}
impl Peaks {
pub fn empty(with_indices: bool) -> Self {
Self {
wavelength: Array1::zeros(0),
frequency: Array1::zeros(0),
magnitude: Array1::zeros(0),
scale_idx: with_indices.then(|| Array1::zeros(0)),
freq_idx: with_indices.then(|| Array1::zeros(0)),
}
}
}
#[derive(Debug, Clone)]
pub struct PeakCloud {
pub wavelength: Array1<f64>,
pub frequency: Array1<f64>,
pub magnitude: Array1<f64>,
pub bus_id: Array1<usize>,
}
impl PeakCloud {
pub fn empty() -> Self {
Self {
wavelength: Array1::zeros(0),
frequency: Array1::zeros(0),
magnitude: Array1::zeros(0),
bus_id: Array1::zeros(0),
}
}
}
#[derive(Debug, Clone)]
pub struct ClusterCloud {
pub wavelength: Array1<f64>,
pub frequency: Array1<f64>,
pub density: Array1<f64>,
}
impl ClusterCloud {
pub fn empty() -> Self {
Self {
wavelength: Array1::zeros(0),
frequency: Array1::zeros(0),
density: Array1::zeros(0),
}
}
}
#[derive(Debug, Clone)]
pub struct NetworkAnalysisResult {
pub peaks: PeakCloud,
pub clusters: ClusterCloud,
}
impl NetworkAnalysisResult {
pub fn empty() -> Self {
Self {
peaks: PeakCloud::empty(),
clusters: ClusterCloud::empty(),
}
}
}