use serde::{Deserialize, Serialize};
#[derive(Debug)]
pub struct Parameters {
values: Vec<f64>,
n_free: usize,
storage_to_assembled: Vec<usize>,
}
impl Parameters {
pub fn new(values: Vec<f64>, n_free: usize, storage_to_assembled: Vec<usize>) -> Self {
Self {
values,
n_free,
storage_to_assembled,
}
}
pub fn values(&self) -> &[f64] {
&self.values
}
pub fn with_values(&self, values: Vec<f64>) -> Self {
Self {
values,
n_free: self.n_free,
storage_to_assembled: self.storage_to_assembled.clone(),
}
}
pub fn get(&self, pid: ParameterID) -> f64 {
self.assembled_index(pid)
.and_then(|index| self.values.get(index))
.copied()
.unwrap_or(f64::NAN)
}
pub fn assembled_index(&self, pid: ParameterID) -> Option<usize> {
self.storage_index(pid)
.and_then(|index| self.storage_to_assembled.get(index).copied())
}
pub fn free_index(&self, pid: ParameterID) -> Option<usize> {
let index = self.assembled_index(pid)?;
(index < self.n_free).then_some(index)
}
fn storage_index(&self, pid: ParameterID) -> Option<usize> {
match pid {
ParameterID::Parameter(index) | ParameterID::Constant(index) => Some(index),
ParameterID::Uninit => None,
}
}
pub fn len(&self) -> usize {
self.n_free
}
pub fn is_empty(&self) -> bool {
self.n_free == 0
}
}
#[derive(Default, Copy, Clone, Debug, Serialize, Deserialize)]
pub enum ParameterID {
Parameter(usize),
Constant(usize),
#[default]
Uninit,
}