sim_lib_numbers_optimize/
lib.rs1use 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
13pub static RECIPES: sim_cookbook::EmbeddedDir =
15 include!(concat!(env!("OUT_DIR"), "/cookbook_recipes.rs"));
16
17#[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}
43pub 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;