mod convergence;
mod runtime;
mod user;
mod view;
pub use user::{Snapshotable, StateRestorer, UserState};
pub(crate) use convergence::ConvergenceState;
pub(crate) use runtime::RuntimeState;
pub(crate) use view::StateView;
use num_traits::float::FloatCore;
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "S: serde::Serialize, S::Float: serde::Serialize",
deserialize = "S: serde::Deserialize<'de>, S::Float: serde::Deserialize<'de>"
))
)]
pub struct State<S: UserState> {
pub(crate) runtime: RuntimeState,
pub(crate) convergence: ConvergenceState<S::Float>,
pub user: S,
}
impl<S> State<S>
where
S: UserState,
<S as UserState>::Float: FloatCore,
{
pub(crate) fn new(user: S) -> Self {
Self {
user,
runtime: RuntimeState::new(),
convergence: ConvergenceState::new(),
}
}
pub fn run_summary(&self) -> crate::RunSummary<<S as UserState>::Float> {
let view = StateView::new(self);
crate::RunSummary::new(view)
}
pub fn into_user(self) -> S {
self.user
}
}