Skip to main content

oximo_solver/
status.rs

1use thiserror::Error;
2
3#[derive(Clone, Debug, PartialEq)]
4pub enum SolverStatus {
5    Optimal,
6    Feasible,
7    Infeasible,
8    Unbounded,
9    TimeLimit,
10    NumericError,
11    NotSolved,
12    Other(String),
13}
14
15impl SolverStatus {
16    pub fn has_solution(&self) -> bool {
17        matches!(self, Self::Optimal | Self::Feasible)
18    }
19}
20
21#[derive(Error)]
22pub enum SolverError {
23    #[error("solver does not support model kind {0:?}")]
24    UnsupportedKind(oximo_core::ModelKind),
25    #[error("model is missing an objective")]
26    NoObjective,
27    #[error("nonlinear constructs are not supported by this backend")]
28    Nonlinear,
29    #[error("backend error: {0}")]
30    Backend(String),
31    #[error(transparent)]
32    Core(#[from] oximo_core::Error),
33}
34
35// Mirror `Display` in `Debug`. When a `main` returning `Result` propagates an
36// error, Rust's `Termination` impl prints it with `{:?}`. The derived `Debug`
37// would escape newlines in `Backend` messages (e.g. multi-line GAMS reports)
38// onto a single line. These messages are human-facing, so render them as-is.
39impl std::fmt::Debug for SolverError {
40    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41        std::fmt::Display::fmt(self, f)
42    }
43}