pub mod config;
pub(crate) mod extract;
pub mod errors;
pub mod numeric;
#[cfg(feature = "python-module")]
mod module;
pub mod run_options;
pub mod schema;
pub mod summary;
pub use errors::{register_exceptions, GaneshConfigError, GaneshNumericalError, GaneshPyError};
pub use run_options::{
PyAIESOptions, PyAdamEMATerminator, PyAdamOptions, PyAutocorrelationTerminator,
PyCMAESConditionCovTerminator, PyCMAESEqualFunValuesTerminator, PyCMAESNoEffectAxisTerminator,
PyCMAESNoEffectCoordTerminator, PyCMAESOptions, PyCMAESSigmaTerminator,
PyCMAESStagnationTerminator, PyCMAESTolFunTerminator, PyCMAESTolXTerminator,
PyCMAESTolXUpTerminator, PyConjugateGradientGTerminator, PyConjugateGradientOptions,
PyDifferentialEvolutionOptions, PyESSOptions, PyLBFGSBFTerminator, PyLBFGSBGTerminator,
PyLBFGSBInfNormGTerminator, PyLBFGSBOptions, PyNelderMeadFTerminator, PyNelderMeadOptions,
PyNelderMeadXTerminator, PyPSOOptions, PySimulatedAnnealingOptions,
PySimulatedAnnealingTemperatureTerminator, PyTrustRegionGTerminator, PyTrustRegionOptions,
};
pub use schema::{ConfigFieldKind, ConfigFieldSchema, ConfigSchema, HasPyConfigSchema};
pub use summary::{
register_summary_types, IntoPySummary, PyMCMCSummary, PyMinimizationSummary,
PySimulatedAnnealingSummary,
};
#[cfg(test)]
pub(crate) fn attach_for_tests<F, R>(f: F) -> R
where
F: for<'py> FnOnce(pyo3::Python<'py>) -> R,
{
use std::sync::Mutex;
static LOCK: Mutex<()> = Mutex::new(());
let _guard = LOCK.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
pyo3::Python::attach(f)
}