oximo-highs
HiGHS LP/MILP backend for oximo.
Wraps the highs crate (HiGHS bundled, no separate install required). Supports LP, MILP, and convex continuous QP model kinds.
Usage
Most users should depend on the umbrella oximo crate with the highs feature (enabled by default):
[]
= "0.3"
To use this crate directly:
[]
= "0.3"
= "0.3"
= "0.3"
Quick example
use *;
use ;
use ;
let m = new;
variable!;
variable!;
constraint!;
constraint!;
objective!;
let result = Highs.solve.unwrap;
assert_eq!;
println!; // 34.0
println!; // 6.0
println!; // 4.0
Quadratic programs (QP)
A quadratic objective (e.g. x.powi(2), x * y) with linear constraints is
detected as QP and solved by uploading the Hessian Q via
Highs_passHessian. oximo derives Q from the objective with
oximo_expr::extract_quadratic; HiGHS then minimizes c'x + 0.5·x'Qx.
use *;
use ;
use ;
let m = new;
variable!;
variable!;
constraint!;
objective!; // min x^2 + y^2
let result = Highs.solve.unwrap;
assert_eq!; // x = y = 0.5, obj = 0.5
Convexity. HiGHS supports only convex QPs. For minimization,
Qmust be positive semidefinite (PSD), and for maximization,Qmust be negative semidefinite (NSD). HiGHS does not check this condition, so supplying an indefinite or incorrectly signed Hessian may lead to incorrect or non-optimal solutions.
HiGHS does not support MIQP (integer + quadratic, returned as
UnsupportedKind) or quadratic constraints (returned as Nonlinear).
Options
HighsOptions is a typed builder. All methods return Self for chaining.
| Method | Type | HiGHS option | Default |
|---|---|---|---|
.time_limit(Duration) |
universal | time_limit |
none |
.threads(usize) |
universal | threads |
none |
.verbose(bool) |
universal | output_flag, log_to_console |
none |
.mip_gap(f64) |
HiGHS-only | mip_rel_gap |
none |
.presolve(HighsPresolve) |
HiGHS-only | presolve |
none |
.method(HighsMethod) |
HiGHS-only | solver |
none |
.parallel(bool) |
HiGHS-only | parallel |
none |
HighsMethod variants: Choose (let HiGHS decide), Simplex, Ipm (interior-point), PdLp (first-order).
HighsPresolve variants: Off, On, Auto ("choose").
use Duration;
use ;
use UniversalOptionsExt;
let opts = default
.time_limit
.threads
.mip_gap
.presolve
.method
.parallel;
Result
SolverResult fields populated on Optimal or Feasible:
solutions- primal points (Vec<SolutionPoint>). This backend returns a single point holding theprimalvalues keyed byVarIdand theobjective(adjusted for any constant term). Access viaresult.objective()/result.value_of(var)dual- constraint duals, keyed byConstraintId, access viaresult.dual_of(c).reduced_costs- variable reduced costs, keyed byVarIdsolve_time- wall time measured around the HiGHS solve calliterations- total solver iterations, summed across HiGHS's per-algorithm counters (simplex/qp/ipm/pdlp/crossover). HiGHS populates only the counter for the method it ran, so the sum is whichever applies;0when the model is solved entirely in presolve
License
MIT OR Apache-2.0