//! basin — a numerical optimization library.
//!
//! The framework lives in [`core`]: problem traits the user implements
//! ([`CostFunction`], [`Gradient`], [`BoxConstraints`],
//! [`LinearInequalityConstraints`], [`LinearEqualityConstraints`]), state shapes
//! solvers iterate over ([`State`], [`GradientState`], [`SimplexState`]),
//! the [`Solver`] trait, and a pluggable termination layer
//! ([`TerminationCriterion`]). Concrete solvers are in [`solver`];
//! line searches in [`line_search`].
//!
//! Start at [`Executor`] for the user-facing driver, or [`core`] for the
//! trait taxonomy and the iteration-loop contract.
//!
//! See `AGENTS.md` at the repo root for the design tenets that shape
//! these APIs (notably tenet 3 on framework-level termination, tenet 4
//! on first-class constraints, and tenet 5 on backend tiering).
//!
//! # Example
//!
//! Implement [`CostFunction`] (and [`Gradient`] when the solver needs
//! derivatives), then hand the problem, a solver, and an initial state to
//! the [`Executor`]:
//!
//! ```
//! use basin::{BasicState, CostFunction, Executor, Gradient, GradientDescent, GradientTolerance};
//!
//! struct Sphere;
//! impl CostFunction for Sphere {
//!     type Param = Vec<f64>;
//!     type Output = f64;
//!     fn cost(&self, x: &Vec<f64>) -> f64 {
//!         x.iter().map(|xi| xi * xi).sum()
//!     }
//! }
//! impl Gradient for Sphere {
//!     type Param = Vec<f64>;
//!     type Gradient = Vec<f64>;
//!     fn gradient(&self, x: &Vec<f64>) -> Vec<f64> {
//!         x.iter().map(|xi| 2.0 * xi).collect()
//!     }
//! }
//!
//! let result = Executor::new(Sphere, GradientDescent::new(0.1), BasicState::new(vec![1.0, 1.0]))
//!     .max_iter(1_000)
//!     .terminate_on(GradientTolerance(1e-8))
//!     .run();
//! assert!(result.cost() < 1e-12);
//! ```
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![deny(missing_docs)]
#![deny(rustdoc::broken_intra_doc_links)]

pub mod core;
pub mod line_search;
/// Catalogue of test problems used by the example tests and benchmarks.
#[cfg(feature = "problems")]
pub mod problems;
/// Concrete solver implementations.
pub mod solver;

pub use crate::core::augmented_lagrangian::AugmentedLagrangian;
pub use crate::core::barrier::LogBarrier;
pub use crate::core::constraint::{
    BoxConstraints, LinearEqualityConstraints, LinearInequalityConstraints,
};
pub use crate::core::executor::{run_loop, Executor, OptimizationResult, StepOutcome, Stepper};
pub use crate::core::inner::{InnerExecutor, WarmStart};
pub use crate::core::math::{
    AddDiagonalInPlace, AddDiagonalVectorInPlace, BoxAffineScaling, ClampInPlace, DenseMatrix,
    DenseMatrixFromFn, Dot, GramMatrix, LinearSolveError, LinearSolveSpd, MatTransposeVec, MatVec,
    MaxDiagonal, NegInPlace, NormInfinity, NormSquared, SampleUniformBox, ScaledAdd, VectorIndex,
};
pub use crate::core::numdiff::{
    central_difference_gradient, central_difference_hessian, central_difference_jacobian,
    forward_difference_gradient, forward_difference_hessian, forward_difference_jacobian,
    FiniteDiff, Method,
};
pub use crate::core::problem::{CostFunction, Gradient, Hessian, Jacobian, Residual};
pub use crate::core::solver::Solver;
pub use crate::core::state::QuasiNewtonState;
pub use crate::core::state::{
    BasicPopulationState, BasicSimplexState, BasicState, GradientState, IntoInitialSimplex,
    LbfgsState, PopulationState, SimplexState, State,
};
pub use crate::core::termination::{
    CostTolerance, GradientTolerance, MaxCostEvals, MaxGradientEvals, MaxIter, MaxTime,
    ParamTolerance, ProjectedGradientTolerance, RelativeCostTolerance, RelativeGradientTolerance,
    RelativeParamTolerance, SimplexTolerance, TerminationCriterion, TerminationReason,
};
pub use crate::line_search::{
    Backtracking, Constant, LineSearch, LineSearchResult, MoreThuente, Wolfe,
};
pub use crate::solver::lbfgs::{LBFGS, LBFGSB};
pub use crate::solver::BFGS;
pub use crate::solver::{
    AugmentedLagrangianMethod, BarrierMethod, BoundedCmaEs, BoundedCmaInject, Brent, ClosureInner,
    CmaEs, CmaInject, GaussNewton, GradientDescent, LevenbergMarquardt, MaLsChCma, MaLsChState,
    MemeticInner, NelderMead, ProjectedGradientDescent, RandomSearch, Ssga, Trf,
};
