use nalgebra::{DMatrix, DVector};
use crate::time::Epoch;
#[derive(Clone, Debug)]
pub struct Observation {
pub epoch: Epoch,
pub measurement: DVector<f64>,
pub model_index: usize,
}
impl Observation {
pub fn new(epoch: Epoch, measurement: DVector<f64>, model_index: usize) -> Self {
Self {
epoch,
measurement,
model_index,
}
}
}
#[derive(Clone, Debug)]
pub struct FilterRecord {
pub epoch: Epoch,
pub state_predicted: DVector<f64>,
pub covariance_predicted: DMatrix<f64>,
pub state_updated: DVector<f64>,
pub covariance_updated: DMatrix<f64>,
pub prefit_residual: DVector<f64>,
pub postfit_residual: DVector<f64>,
pub kalman_gain: DMatrix<f64>,
pub measurement_name: String,
}
#[derive(Clone, Debug)]
pub struct BLSIterationRecord {
pub iteration: usize,
pub epoch: Epoch,
pub state: DVector<f64>,
pub covariance: DMatrix<f64>,
pub state_correction: DVector<f64>,
pub state_correction_norm: f64,
pub cost: f64,
pub rms_prefit_residual: f64,
pub rms_postfit_residual: f64,
}
#[derive(Clone, Debug)]
pub struct BLSObservationResidual {
pub epoch: Epoch,
pub model_name: String,
pub prefit_residual: DVector<f64>,
pub postfit_residual: DVector<f64>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::time::TimeSystem;
use nalgebra::{DMatrix, DVector};
#[test]
fn test_bls_iteration_record_construction() {
let epoch = Epoch::from_datetime(2024, 1, 1, 0, 0, 0.0, 0.0, TimeSystem::UTC);
let state = DVector::from_vec(vec![6878e3, 0.0, 0.0, 0.0, 7612.0, 0.0]);
let cov = DMatrix::identity(6, 6);
let correction = DVector::from_vec(vec![100.0, 0.0, 0.0, 0.0, 0.0, 0.0]);
let record = BLSIterationRecord {
iteration: 0,
epoch,
state: state.clone(),
covariance: cov,
state_correction: correction.clone(),
state_correction_norm: correction.norm(),
cost: 1234.5,
rms_prefit_residual: 50.0,
rms_postfit_residual: 5.0,
};
assert_eq!(record.iteration, 0);
assert_eq!(record.state_correction_norm, 100.0);
assert_eq!(record.cost, 1234.5);
}
#[test]
fn test_bls_observation_residual_construction() {
let epoch = Epoch::from_datetime(2024, 1, 1, 0, 0, 0.0, 0.0, TimeSystem::UTC);
let residual = BLSObservationResidual {
epoch,
model_name: "InertialPosition".to_string(),
prefit_residual: DVector::from_vec(vec![10.0, 20.0, 30.0]),
postfit_residual: DVector::from_vec(vec![0.1, 0.2, 0.3]),
};
assert_eq!(residual.model_name, "InertialPosition");
assert_eq!(residual.prefit_residual.len(), 3);
}
}