use crate::dynamics::DynamicsError;
pub use crate::dynamics::{Dynamics, NyxError};
use crate::errors::StateError;
use crate::io::{ConfigError, InputOutputError};
use crate::linalg::OVector;
use crate::md::prelude::SpacecraftDynamics;
use crate::md::trajectory::TrajError;
use crate::propagators::PropagationError;
use crate::time::Epoch;
pub use crate::{State, TimeTagged};
use anise::almanac::planetary::PlanetaryDataError;
use anise::errors::AlmanacError;
use hifitime::Duration;
use snafu::prelude::Snafu;
use std::sync::Arc;
pub mod kalman;
mod ground_station;
pub use ground_station::GroundStation;
pub mod estimate;
pub mod noise;
pub mod msr;
pub mod simulator;
pub mod process;
pub use simulator::TrackingDevice;
pub mod snc;
pub mod blse;
#[cfg(feature = "premium")]
pub mod interlink;
#[cfg(feature = "premium")]
pub mod groundpnt;
#[cfg(feature = "premium")]
pub mod position;
pub type SpacecraftKalmanOD = self::process::KalmanODProcess<
SpacecraftDynamics,
nalgebra::Const<2>,
nalgebra::Const<3>,
GroundStation,
>;
pub type SpacecraftKalmanScalarOD = self::process::KalmanODProcess<
SpacecraftDynamics,
nalgebra::Const<1>,
nalgebra::Const<3>,
GroundStation,
>;
#[cfg(feature = "premium")]
pub type InterlinkKalmanOD = self::process::KalmanODProcess<
SpacecraftDynamics,
nalgebra::Const<2>,
nalgebra::Const<3>,
interlink::InterlinkTxSpacecraft,
>;
#[allow(unused_imports)]
pub mod prelude {
pub use super::estimate::*;
pub use super::ground_station::*;
pub use super::kalman::KalmanVariant;
pub use super::kalman::*;
pub use super::msr::*;
pub use super::noise::{GaussMarkov, StochasticNoise, WhiteNoise};
pub use super::process::*;
pub use super::simulator::TrackingArcSim;
pub use super::simulator::*;
pub use super::snc::*;
pub use super::*;
pub use crate::time::{Duration, Epoch, TimeUnits, Unit};
}
#[derive(Debug, PartialEq, Snafu)]
#[snafu(visibility(pub(crate)))]
pub enum ODError {
#[snafu(display("during an orbit determination, encountered {source}"))]
ODPropError {
#[snafu(source(from(PropagationError, Box::new)))]
source: Box<PropagationError>,
},
#[snafu(display("during an orbit determination, encountered {source}"))]
ODDynamicsError {
#[snafu(source(from(DynamicsError, Box::new)))]
source: Box<DynamicsError>,
},
#[snafu(display("at least {need} measurements required for {action}"))]
TooFewMeasurements { need: usize, action: &'static str },
#[snafu(display("invalid step size: {step}"))]
StepSizeError { step: Duration },
#[snafu(display("filter iteration did not converge in {loops} iterations"))]
Diverged { loops: usize },
#[snafu(display("STM is singular"))]
SingularStateTransitionMatrix,
#[snafu(display("invalid measurement @ {epoch} = {val}"))]
InvalidMeasurement { epoch: Epoch, val: f64 },
#[snafu(display("Kalman gain is singular"))]
SingularKalmanGain,
#[snafu(display("Information matrix is singular"))]
SingularInformationMatrix,
#[snafu(display("noise matrix is singular"))]
SingularNoiseRk,
#[snafu(display("{kind} noise not configured"))]
NoiseNotConfigured { kind: String },
#[snafu(display("measurement sim error: {details}"))]
MeasurementSimError { details: String },
#[snafu(display("during an OD encountered {source}: {details}"))]
ODTrajError { source: TrajError, details: String },
#[snafu(display("OD failed because {source}"))]
ODConfigError { source: ConfigError },
#[snafu(display("OD failed because of an I/O error: {source}"))]
ODIOError { source: InputOutputError },
#[snafu(display("OD failed due to Almanac: {action} {source}"))]
ODAlmanac {
#[snafu(source(from(AlmanacError, Box::new)))]
source: Box<AlmanacError>,
action: &'static str,
},
#[snafu(display("OD failed due to planetary data in Almanac: {action} {source}"))]
ODPlanetaryData {
#[snafu(source(from(PlanetaryDataError, Box::new)))]
source: Box<PlanetaryDataError>,
action: &'static str,
},
#[snafu(display("not enough residuals to {action}"))]
ODNoResiduals { action: &'static str },
#[snafu(display("could not {action} OD results: {source}"))]
ODStateError {
#[snafu(source(from(StateError, Box::new)))]
source: Box<StateError>,
action: &'static str,
},
#[snafu(display("Maximum iterations ({max_iter}) reached without convergence"))]
ODMaxIterations { max_iter: usize },
#[snafu(display("Nyx orbit determination limitation: {action}"))]
ODLimitation { action: &'static str },
}