01 · The problem

A refinery asked for a sovereign alternative to CPLEX and Xpress.

Problem statement SIH26119, Mangalore Refinery and Petrochemicals Ltd. Below: what a refinery model looks like, what the statement demands, and why "not built on another solver" is the hard part.

The model

What a refinery solves every week.

Crude A · ₹ Crude B · ₹ Crude C · ₹ decision: how much of each CDUthroughput windowyields per crude naphtha diesel pool fuel oil tanks · carry-over sulphur ≤ 10 ppmquality budget per pool diesel ≥ commitmentdelivery contracts minimise costthe objective
Crude choice, unit throughput and pool blending under quality and delivery constraints. This shape is demo/crude_blend.mps at small size and the generated refinery year at 779,640 rows.
Why it matters

Three reasons this is not a toy.

Constant re-planning

Crude purchases, unit runs and blends are re-decided all the time. Each decision is an LP or MILP.

Licensed and opaque

Today's answers come from foreign software nobody in the plant can inspect, audit or extend.

Wrong answers are silent

A plan that violates a spec by one part in a thousand does not crash. It ships a bad blend.

The statement

What SIH26119 asks for, against what exists on main.

From the coverage tracker in the repository, checked against the source.

donepartialnot started
  • Linear programming · revised simplex, primal and dual
  • Mixed-integer LP · branch and bound, reliability branching
  • Convex QP and MIQP · non-convex refused with a certificate
  • Modular for NLP / MINLP · the seam exists, no nonlinear engine yet
  • First-order method · restarted PDHG, finished by the interior point
  • Interior point · Mehrotra, sparse LDLᵀ, opt-in
  • Presolve, cutting planes, heuristics · cuts off by default, by measurement
  • Sensitivity ranging · cost and right-hand side, degeneracy stated
  • Sparse linear algebra · Markowitz LU, hyper-sparse solves, LDLᵀ
  • Multi-core · OpenMP column loops, bit-identical at any thread count
  • GPU acceleration · backend written, never built: no GPU yet
  • Netlib, MIPLIB, Mittelmann benchmarks · all three run and committed
  • Compared with an established solver · HiGHS, separate process
  • Robustness: degenerate, ill-conditioned, weak relaxations · all three demonstrated
  • Thousands to millions of variables · a million rows on generated families; 32,485 rows of the refinery year exactly
  • Not built on any existing solver · enforced in CI

32 checkable requirements: 28 done, 3 partial, 1 not started. The tracker cites the commit and CSV behind each row.

Sovereign

What "not a wrapper" has to mean, and how it is enforced.

0lines of code from CPLEX, Xpress, Gurobi, HiGHS, CBC, SCIP, GLPK, OSQP, PDLP or cuPDLPdocs/PROVENANCE.md, the red line
5libraries linked, none of them a solver: fmt, CLI11, nlohmann/json, zlib, GoogleTest (tests only)dependency table, with why each is not a solver
CIdumps the link line and fails the build if a solver library ever appears in the binary.github/workflows/ci.yml, provenance job
SPDXbill of materials generated from the pinned tags and checked on every pushdocs/sbom.spdx.json