solve(const Model&, const Options&) → Solution is the one entry point. Everything below plugs into it.
Bounded-variable revised simplex, sparse Markowitz LU, Devex pricing. Produces a basis: the node engine for branch and bound. auto picks it by a rule table whose every threshold names its CSV.
Composite phase 1, no big-M. The hand-over engine when a basis needs repair.
Mehrotra predictor-corrector through a from-scratch sparse LDLᵀ with AMD ordering, started from Mehrotra's shifted point. On its own it verifies 72 of 89 Netlib instances (51 before the new start, 69 before it learned to raise its regularization when a Newton direction comes back non-finite). Its answer is pushed to a vertex by crossover, so it carries a basis; a set-up past a fifth of the time limit declines, and another engine takes the rest.
Two sparse mat-vecs and a projection per iteration: the GPU shape. Finished by the interior point from its own point. The CUDA port compiles in CI; it has not run on a card.
Reliability branching, dive then best-bound, warm-started dual node LPs. Gomory, cover and mixed-integer rounding cuts at the root and in rounds below it, with an aged cut pool; off by default because the A/B on MIPLIB proves the same 9 with or without them.
Convexity decided by LDLᵀ before any arithmetic. A non-convex Hessian is refused, never reported as global.
The verifier reads the model file and the solution file and re-derives feasibility, duality, integrality and the gap. Infeasible carries a Farkas certificate; unbounded carries a ray; an IIS carries witnesses. All proved, not trusted.
Three kinds of solver exist: open-source simplex codes, commercial ones, GPU first-order codes.