pub mod acov;
pub mod arma;
pub mod cancorr;
pub mod criteria;
pub mod dist;
pub mod eacf;
pub mod hankel;
pub mod integration;
pub mod levinson;
pub mod linalg;
pub mod robust;
pub mod select;
#[cfg(feature = "sim")]
pub mod sim;
pub mod threshold;
pub use acov::{acf, autocovariance};
pub use arma::{hannan_rissanen, HrConfig, HrResult};
pub use cancorr::{
canonical_correlations, canonical_correlations_from_acov, canonical_correlations_stacked,
svc_order, Cancorr, SvcConfig, SvcPenalty, SvcResult,
};
pub use criteria::{ic_order, ic_order_with, Criterion, IcMethod, IcResult};
pub use dist::{chi2_sf, df_tau_c_critical, imhof_sf, kpss_critical, satterthwaite_sf};
pub use eacf::{eacf, EacfConfig, EacfResult};
pub use hankel::{
hankel_rank_order, hankel_svt_order, HankelRankConfig, HankelRankResult, HankelSvtConfig,
HankelSvtResult, RankAlpha, RankPvalue,
};
pub use integration::{integration_order, IntegrationConfig, IntegrationResult, UnitRootTest};
pub use levinson::{burg_from_series, levinson, levinson_from_series, Levinson};
pub use robust::{qn, robust_autocorrelation, robust_autocovariance, shrink_to_psd};
#[cfg(feature = "ensemble")]
pub use select::{ensemble_order, EnsembleResult, EnsembleRule};
pub use select::{fh_order, FhConfig, FhResult, Statistic};
pub use select::{jirak_order, JirakConfig, JirakResult};
pub use threshold::{polylog_memory, power_memory, Memory, Threshold};
#[derive(Debug, Clone, PartialEq)]
pub enum Error {
TooShort { n: usize, needed: usize },
NonFinite,
Singular,
Invalid(&'static str),
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Error::TooShort { n, needed } => {
write!(
f,
"series of length {n} is too short (need at least {needed})"
)
}
Error::NonFinite => write!(f, "input contains NaN or infinite values"),
Error::Singular => write!(f, "sample covariance matrix is singular"),
Error::Invalid(m) => write!(f, "invalid argument: {m}"),
}
}
}
impl std::error::Error for Error {}
pub type Result<T> = core::result::Result<T, Error>;
pub(crate) fn check_input(x: &[f64], needed: usize) -> Result<()> {
if x.len() < needed {
return Err(Error::TooShort { n: x.len(), needed });
}
if x.iter().any(|v| !v.is_finite()) {
return Err(Error::NonFinite);
}
Ok(())
}