#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum ParameterKind {
StatePositionX,
StatePositionY,
StatePositionZ,
StateVelocityX,
StateVelocityY,
StateVelocityZ,
ReceiverClockBias {
receiver_id: String,
},
DragScale,
SrpScale,
CarrierAmbiguity {
receiver_id: String,
satellite_id: String,
signal: String,
},
SlrRangeBias {
station_id: String,
},
EmpiricalAcceleration {
frame: String,
component: char,
},
Custom(String),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Parameter {
pub kind: ParameterKind,
pub initial_value: f64,
pub apriori_sigma: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ParameterOrdering {
pub params: Vec<Parameter>,
}
impl ParameterOrdering {
pub fn len(&self) -> usize {
self.params.len()
}
pub fn is_empty(&self) -> bool {
self.params.is_empty()
}
pub fn index_of(&self, kind: &ParameterKind) -> Option<usize> {
self.params.iter().position(|p| &p.kind == kind)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ordering_lookup() {
let ord = ParameterOrdering {
params: vec![
Parameter {
kind: ParameterKind::StatePositionX,
initial_value: 7000.0,
apriori_sigma: Some(0.1),
},
Parameter {
kind: ParameterKind::DragScale,
initial_value: 1.0,
apriori_sigma: Some(0.2),
},
],
};
assert_eq!(ord.index_of(&ParameterKind::DragScale), Some(1));
assert_eq!(ord.index_of(&ParameterKind::SrpScale), None);
}
}