Skip to main content

sim_lib_numbers_optimize/
lib.rs

1//! Bounded optimization with explicit plans and honest convergence evidence.
2
3use core::fmt;
4use sim_kernel::{
5    AbiVersion, Export, Lib, LibManifest, LibTarget, Linker, Result as KernelResult, Symbol,
6    Version,
7};
8use sim_lib_numbers_tensor_decomp::{
9    SingularCutoff, SvdPlan, VectorForm, least_squares as svd_least_squares, numerical_rank,
10    svd_f64,
11};
12
13/// Cookbook recipes embedded for runtime discovery.
14pub static RECIPES: sim_cookbook::EmbeddedDir =
15    include!(concat!(env!("OUT_DIR"), "/cookbook_recipes.rs"));
16
17/// Loadable schema surface for optimization policy and evidence discovery.
18#[derive(Default)]
19pub struct OptimizeLib;
20impl OptimizeLib {
21    pub fn new() -> Self {
22        Self
23    }
24}
25impl Lib for OptimizeLib {
26    fn manifest(&self) -> LibManifest {
27        LibManifest {
28            id: Symbol::qualified("numbers", "optimize"),
29            version: Version(env!("CARGO_PKG_VERSION").to_owned()),
30            abi: AbiVersion { major: 0, minor: 1 },
31            target: LibTarget::HostRegistered,
32            requires: Vec::new(),
33            capabilities: Vec::new(),
34            exports: vec![Export::Value {
35                symbol: optimize_schema_symbol(),
36            }],
37        }
38    }
39    fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> KernelResult<()> {
40        linker.value(optimize_schema_symbol(),cx.factory().string("bounded-brent projected-bfgs levenberg-marquardt trust-region-reflective active-set-linear-least-squares rank covariance termination work assignment-adapter".to_owned())?)
41    }
42}
43/// Runtime inspection symbol.
44pub fn optimize_schema_symbol() -> Symbol {
45    Symbol::qualified("numbers/optimize", "schema")
46}
47
48mod least_squares;
49mod minimize;
50mod model;
51mod scalar;
52
53pub use least_squares::*;
54pub use minimize::*;
55pub use model::*;
56pub use scalar::*;
57
58#[cfg(feature = "assignment")]
59pub mod assignment {
60    use sim_lib_discrete_graph::{
61        Assignment, AssignmentPolicy, CostMatrix, GraphError, min_cost_assignment,
62    };
63    pub fn assign(
64        costs: Vec<Vec<f64>>,
65        policy: AssignmentPolicy<f64>,
66    ) -> Result<Assignment<f64>, GraphError> {
67        let matrix = CostMatrix::try_from(costs)?;
68        min_cost_assignment(&matrix, policy)
69    }
70}
71
72#[cfg(test)]
73mod tests;