Skip to main content

oximo_highs/
lib.rs

1#![doc = include_str!("../README.md")]
2#![forbid(unsafe_code)]
3
4mod options;
5mod persistent;
6mod translate;
7
8pub use options::{HighsMethod, HighsOptions, HighsPresolve};
9pub use persistent::HighsPersistent;
10pub use translate::solve;
11
12use oximo_core::{Model, ModelKind};
13use oximo_solver::{PersistentSolver, Solver, SolverError, SolverResult};
14
15/// HiGHS solver handle.
16///
17/// [`Solver::solve`] builds a fresh HiGHS instance for each call, so models can be
18/// re-used or shared freely. For repeated solves of one model (parameter sweeps,
19/// sensitivity studies, rolling horizons), build a resident handle with
20/// [`Highs::persistent`](PersistentSolver::persistent).
21#[derive(Debug, Default, Clone, Copy)]
22pub struct Highs;
23
24/// Display name for this backend; the single source for both [`Solver::name`]
25/// and the `solver_name` stamped on every [`SolverResult`].
26pub(crate) const NAME: &str = "HiGHS";
27
28/// The model kinds HiGHS can solve: linear models and quadratic-objective QP.
29pub(crate) const fn supported(kind: ModelKind) -> bool {
30    matches!(kind, ModelKind::LP | ModelKind::MILP | ModelKind::QP)
31}
32
33impl Solver for Highs {
34    type Options = HighsOptions;
35
36    fn name(&self) -> &str {
37        NAME
38    }
39
40    fn supports(&self, kind: ModelKind) -> bool {
41        supported(kind)
42    }
43
44    fn solve(&mut self, model: &Model, opts: &HighsOptions) -> Result<SolverResult, SolverError> {
45        translate::solve(model, opts)
46    }
47}
48
49impl PersistentSolver for Highs {
50    type Handle = HighsPersistent;
51
52    fn persistent(&self) -> HighsPersistent {
53        HighsPersistent::new()
54    }
55}