Learning Warm Starts for the Simplex Method from Measured Solver Cost
Organizations: Center for Systems Science and Engineering, Johns Hopkins University
Abstract
Learned warm starts for the simplex method build starting bases using predictions of which variables will be basic at optimality. Prior work has shown that starting bases predicted by graph neural networks can sharply reduce iteration counts, but the time saved may fall well short of the iterations saved. On 25 classes of linear programs (LPs), we find that a strong supervised basis predictor removes two thirds of the dual simplex's iterations but only a third of its time. Two effects explain the gap: the iterations removed by a good start tend to be cheap, and closeness to an optimal basis does not rank starts by cost. We prove that two starts with equal overlap with an optimal basis and equal pivot counts can differ in linear-algebra work by a factor that grows with the square root of the number of rows. Empirically, across the starts of one LP, the pivot count explains 71% of the variance of log solve time, while the CPU instruction count explains 98.5%. We introduce CostStart, which uses supervised prediction for the basis and trains a small policy on measured instruction counts to choose, per LP, how many predicted columns to use, which algorithm and pricing rule to run, and whether to warm-start at all. On unseen LPs of the training classes, including LPs four times the training size, CostStart roughly halves the solve time relative to the solver's default start and is 1.4 to 2.2 times as fast as two published methods retrained on the same data.
Figures & tables
| Fan et al. (2023) : iterations / time | Lu & Yan (2025) : iterations / time | ||||
|---|---|---|---|---|---|
| Dataset | OptVerse | HiGHS | Dataset | unpresolved | presolved |
| LIBSVM | 0.61 / 0.66 | 0.58 / 0.62 | Mirp1 | 0.42 / 0.52 | 0.32 / 0.42 |
| MIRP | 0.64 / 0.70 | 0.61 / 0.81 | Mirp2 | 0.93 / 1.05 | 0.86 / 0.83 † |
| STOCH | 0.42 / 0.96 | 0.48 / 0.35 † | Anonymous | 0.59 / 0.72 | 0.74 / 1.19 |
| GEN | 0.23 / 0.38 | 0.04 / 0.15 | Load balancing | 0.46 / 0.71 | 0.63 / 0.70 |
| SC-1 | 0.10 / 0.29 | 0.25 / 0.52 | |||
| Test-20k (1,356 LPs) | Test-50k (382 LPs) | Test-80k (81) | |||||
| Method | iter. | time [95% CI] | W/L | iter. | time [95% CI] | W/L | time |
| all-slack dual simplex | 1.00 | 1.07 [0.87, 1.30] | 12/13 | 1.00 | 0.99 [0.76, 1.30] | 12/13 | 0.96 |
| stock solver, presolve on | 0.85 | 1.10 [1.06, 1.16] | 3/22 | – | – | – | – |
| classical crash | 1.22 | 1.76 [1.19, 2.60] | 9/16 | – | – | – | – |
| Fan et al. | 0.49 | 1.10 [0.89, 1.35] | 15/10 | 0.50 | 1.02 [0.78, 1.37] | 15/10 | 0.96 |
| Lu & Yan | 0.47 | 0.94 [0.70, 1.22] | 14/11 | 0.50 | 0.85 [0.56, 1.23] | 19/6 | 0.72 |
| LPs | Label | instructions [95% CI] | iterations | per iteration | Devex | primal |
|---|---|---|---|---|---|---|
| held-out, W1 (1,531) | instructions | 0.669 [0.589, 0.751] | 0.892 | 0.749 | 51% | 8% |
| iterations | 0.937 [0.817, 1.103] | 0.759 | 1.234 | 12% | 36% | |
| held-out, W2 (316) | instructions | 0.668 [0.526, 0.826] | 0.729 | 0.916 | 29% | 20% |
| iterations | 0.679 [0.489, 0.998] | 0.601 | 1.129 | 5% | 51% | |
| selection split of Dev-20k (275 of 283) | instructions | 0.682 [0.570, 0.797] | 0.868 | 0.786 | 60% | 9% |
| iterations | 0.960 [0.798, 1.170] | 0.723 | 1.327 | 15% | 46% |
| (a) Larger LPs | Test-50k | Test-80k |
|---|---|---|
| (309) | (63) | |
| all-slack dual simplex | 0.94 | 0.90 |
| predictor | 0.65 (1) | 0.83 (1) |
| Devex on every LP | 0.66 | 0.78 (1) |
| CostStart-Shift | 0.58 | 0.67 |
| CostStart-Alg | 0.60 (2) | 0.83 (1) |
| Method (decoder) | Mirp1 | Mirp2 | Anonymous | Load bal. | Geomean [95%] |
|---|---|---|---|---|---|
| Fan et al. reimplemented (top- ) | 0.58 / 0.72 | 1.01 / 1.14 | 0.92 / 1.62 | 0.61 / 0.69 | 0.76 / 0.98 [0.93, 1.04] |
| Fan et al. reimplemented (top- repair) | 0.55 / 0.69 | 0.78 / 0.92 | 0.87 / 1.69 | 0.56 / 0.68 | 0.68 / 0.92 [0.86, 0.99] |
| Lu & Yan reimplemented (top- ) | 0.70 / 1.10 | 0.92 / 1.07 | 0.71 / 1.37 | 0.60 / 0.68 | 0.72 / 1.02 [0.95, 1.10] |
| Lu & Yan reimplemented (top- repair) | 0.71 / 1.12 | 0.80 / 0.99 | 0.70 / 1.48 | 0.58 / 0.70 | 0.69 / 1.03 [0.96, 1.12] |
| our predictor, fine-tuned (top- ) | 0.43 / 0.64 | 1.00 / 1.07 | 0.55 / 1.05 | 0.59 / 0.67 | 0.61 / 0.83 [0.78, 0.88] |
| our predictor, fine-tuned (top- repair) | 0.35 / 0.57 | 0.99 / 1.06 | 0.56 / 1.27 | 0.55 / 0.69 | 0.57 / 0.85 [0.80, 0.91] |
Appendix figures & tables32 assets
Supplementary material from the paper’s appendix.
Appendix
| Setting | cold | warm A | warm B | warm B / warm A |
|---|---|---|---|---|
| Devex forced, scaling off | 1.21 | 0.156 | 4.21 | 27.0 |
| DSE requested, scaling off | 1.48 | 34.0 | 34.6 | 1.02 |
| HiGHS defaults | 26.4 | 36.1 | 34.9 | 0.97 |
| Statistic | Value [95% CI] |
|---|---|
| Kendall with time | |
| overlap | 0.31 [0.22, 0.41] |
| pivot count | 0.65 [0.59, 0.71] |
| instruction count | 0.91 [0.89, 0.93] |
| Kendall , other pairs | |
| overlap and pivot count | 0.45 [0.36, 0.55] |
| Change | Ratio |
|---|---|
| Recipe | |
| main recipe, 5 seeds (mean sd) | |
| ensemble of the 5 seeds | 0.900 [0.839, 0.961]; pivots 0.920; summed instructions 0.905 |
| hidden width 64 / 256 / 512 / 1024 | 0.900 / 0.900 / 0.904 / 0.925 |
| learning rate / | 0.896 / 0.898 |
| loss clip 1 / 6 / none | 0.903 / 0.891 / 0.888 |
| Rule | Ratio |
|---|---|
| best fixed shift chosen on training data | 1.000 ( ) |
| every other fixed shift | 1.005 to 1.090 |
| best fixed retune of the decoder (shift and degree exponent) | 0.967 |
| best constant shift per class, chosen in hindsight | 0.926 |
| learned policy, score statistics only (no embedding) | 0.975 |
| learned policy, embedding only | 0.897 |
| Action set | W1 | W2 |
|---|---|---|
| Design of CostStart-Alg | ||
| shifts only | 0.906 / 0.935 | 0.851 |
| shifts and native solver | 0.810 / 0.781 | 0.792 |
| shifts, native solver and primal simplex ( , chosen) | 0.783 / 0.754 | 0.605 |
| plus all-slack dual simplex and classical crash | 0.796 / 0.773 | 0.648 |
| Design of CostStart-Full | ||
| Dev-20k panel | Dev-50k | |||
|---|---|---|---|---|
| Method | W1 | W2 | W1 | W2 |
| CostStart-Full | 0.761 [0.618, 0.912] | 0.524 [0.409, 0.666] | 0.891 [0.813, 0.971] | 0.857 [0.719, 0.993] |
| + check and harm gate | – | – | 0.751 | 0.682 |
| CostStart-Alg | 0.801 | 0.462 | 0.941 [0.88, 1.00] | 0.856 [0.73, 0.97] |
| + check and harm gate | – | – | 0.796 | 0.679 |
| predictor, Devex on every LP | 0.980 | 1.189 | 0.865 [0.730, 1.019] | 1.372 [0.943, 2.326] |
| Option | instructions | iterations | work per iteration | failures |
|---|---|---|---|---|
| Devex pricing | 0.910 | 1.067 | 0.853 | 0 |
| Dantzig pricing | 1.846 | 2.073 | 0.891 | 7 |
| DSE without the switch to Devex | 1.057 | 0.982 | 1.076 | 0 |
| price strategy 1 / 2 | 1.010 / 0.994 | 1.000 | 1.010 / 0.994 | 0 |
| cost perturbation off / | 1.160 / 1.046 | 1.121 / 1.035 | 1.035 / 1.011 | 1 / 0 |
| factor pivot threshold 0.01 / 0.5 | 1.007 / 1.014 | 1.005 / 1.011 | 1.003 / 1.003 | 0 |
| Contrast | time | iterations | time per iteration | fixed |
|---|---|---|---|---|
| CostStart-Full vs. CostStart-Alg | 0.959 [0.884, 1.046] | 1.149 [1.051, 1.282] | 0.821 [0.730, 0.909] | 1.017 |
| CostStart-Alg vs. CostStart-Shift | 0.831 [0.744, 0.915] | 0.820 | 1.084 | 0.934 |
| CostStart-Full vs. CostStart-Shift | 0.796 [0.696, 0.903] | 0.942 | 0.890 [0.815, 0.961] | 0.950 |
| predictor vs. Lu & Yan | 0.725 [0.637, 0.823] | 0.671 | 1.078 [0.946, 1.212] | 1.002 |
| Component | Setting |
|---|---|
| Predictor | 8-layer GATv2 on the variable-constraint graph, 1.8M parameters, 72-dimensional pooled embedding; fused kernel with TF32, one LP per forward pass (6.4 ms median at 20k variables on an H100) |
| stage 1 | 114,874 LPs of Train-Small , 12 epochs (43k steps, 32 LPs per step, edge budget 400k), AdamW at without weight decay, warm-up and cosine decay, gradient clip 5; loss: basis-membership cross-entropy divided by plus auxiliary dual-tightness and bound-status terms |
| stage 2 | 3,457 LPs of Train-20k , 6 passes, 48 LPs per step, AdamW at , clip 1; checkpoint every 37 steps, chosen by paired solve time on the 283-LP selection split of Dev-20k |
| Decoder | entry threshold of the column maximum, degree exponent , shifts |
| Policies | MLP , SiLU, dropout 0.1, AdamW (weight decay ), batch 256 LPs, loss clip , failures at , last layer initialized to the unshifted start |
| CostStart-Shift | ; 7,699 training LPs; learning rate , 100 epochs, 3 seeds |
| Axis | Effect on the emitted model | Cardinality |
|---|---|---|
| variant | the formulation itself | |
| target_variables | dimensions re-derived, not padded | wide range |
| seed | fresh data at fixed size and structure | unbounded |
| feasibility_status | feasible / infeasible / unknown | 3 |
| relax_integer | a MIP, or its LP relaxation | 2 |
| bounds_to_constraints | bounds kept, or emitted as explicit rows | 2 |
| Requested | Formulations | Median ratio | Within | Within | Median build (s) |
|---|---|---|---|---|---|
| 129 | 91 % | 99 % | – | ||
| 129 | 96 % | 100 % | |||
| 129 | 97 % | 98 % | |||
| 93 | 96 % | 97 % | |||
| 78 | 90 % | 91 % |
| Property (median) | Netlib | Synthetic | Assessment |
|---|---|---|---|
| Matrix density | close | ||
| Nonzeros per column | close | ||
| Nonzeros per row | close | ||
| Column-degree variability (CV) | close | ||
| Primal degeneracy | about half | ||
| Simplex iterations per row | less work |
| Feature | Synthetic | Netlib |
|---|---|---|
| Matrix density | 0.006–1.000 | 0.000–0.092 |
| Nonzeros per column | 1.96–55.98 | 2.18–14.24 |
| Column-degree variability (CV) | 0.00–2.40 | 0.11–1.23 |
| Coefficient spread, | 0.00–5.75 | 0.00–8.65 |
| Fraction of entries equal to | 0.000–1.000 | 0.094–1.000 |
| Primal degeneracy | 0.000–0.800 | 0.000–0.841 |
| Category | # | Use | Formulations |
|---|---|---|---|
| airline_crew | 1 | standard | |
| assignment | 2 | standard, workload_balance | |
| bin_packing | 2 | train, test | heterogeneous, standard |
| blending | 3 | unseen | equipment_batches, multi_product, standard |
| container_loading | 2 | unseen | standard, two_dimensional_bin_packing |
| crop_planning | 1 | train, test | standard |
| Set | Variables | LPs | Classes | Use |
|---|---|---|---|---|
| Train-Small | 50–2,000 | 114,874 | 37 | predictor, stage 1 |
| Train-20k | 15k–25k | 9,511 | 26 (25 with test LPs) | predictor stage 2 (3,457 LPs); policies and gates |
| Dev-20k | 15k–25k | 450 | 25 | selection and ablations; half twinned with training |
| selection split | 15k–25k | 283 of Dev-20k | 22 | checkpoints, epochs and designs |
| Dev-50k | 40k–60k | 454 | 23 | optimality check; policies at larger sizes |
| Test-20k | 15k–25k | 1,356 | 25 | main result |
| Test-20k (1,356 LPs) | Test-50k (382 LPs) | Test-80k | |||||
| Method | iter. | time [95% CI] | W/L | iter. | time [95% CI] | W/L | time (81) |
| all-slack dual simplex | 1.00 | 1.07 [0.87, 1.30] | 12/13 | 1.00 | 0.99 [0.76, 1.30] | 12/13 | 0.96 |
| stock solver, presolve on | 0.85 | 1.10 [1.06, 1.16] | 3/22 | – | – | – | – |
| classical crash | 1.22 | 1.76 [1.19, 2.60] | 9/16 | – | – | – | – |
| Fan et al. (original budget) | 0.50 | 1.10 [0.89, 1.38] | 15/10 | 0.52 | 1.00 [0.78, 1.28] | 15/10 | 0.96 |
| Fan et al. (full budget) | 0.49 | 1.10 [0.89, 1.35] | 15/10 | 0.51 | 1.02 [0.78, 1.37] | 15/10 | 0.96 |
| Method | time [95% CI] | W/L | iterations | summed | failures |
| W1 ( s): 1,052 LPs, 24 classes | |||||
| native solver (reference) | 1.00 | – | 0.86 | 1.00 | 0 |
| all-slack dual | 1.04 [0.85, 1.29] | 10/14 | 1.00 | 0.91 | 0 |
| stock solver, presolve on | 1.13 [1.09, 1.18] | 1/23 | 0.86 | 1.03 | 0 |
| classical crash | 1.84 [1.28, 2.72] | 9/15 | 1.27 | 2.65 | 1 |
| Fan et al. | 1.09 [0.88, 1.37] | 14/10 | 0.46 | 1.20 | 0 |
| baselines | CostStart | |||||||
| Class | LPs | all-slack | Fan et al. | Lu & Yan | predictor | Shift | Alg | Full |
| bin packing | 50 | 0.46 | 0.96 | 1.00 | 0.83 | 0.54 | 0.50 | 0.74 |
| crop planning | 11 | 1.05 | 0.74 | 0.80 | 0.68 | 0.92 | 0.70 | 0.69 |
| energy | 104 | 0.74 | 0.79 | 0.81 | 0.58 | 0.64 | 0.53 | 0.50 |
| facility location | 37 | 2.92 | 2.07 | 1.63 | 1.39 | 1.19 | 1.02 | 0.91 |
| graph optimization | 156 | 1.26 | 1.09 | 1.12 | 0.76 | 0.69 | 0.36 | 0.63 |
| DSE pricing | Devex pricing | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| System | window | LPs | native | primal | ||||||
| CostStart-Full | W1 | 1,052 | 8.1 | 7.2 | 0.0 | 12.9 | 16.7 | 41.8 | 0.0 | 13.2 |
| W2 | 267 | 16.1 | 25.8 | 0.0 | 7.9 | 27.3 | 20.2 | 0.0 | 2.6 | |
| W3 | 37 | 0.0 | 29.7 | 0.0 | 0.0 | 24.3 | 29.7 | 0.0 | 16.2 | |
| all | 1,356 | 9.4 | 11.5 | 0.0 | 11.6 | 19.0 | 37.2 | 0.0 | 11.2 | |
| CostStart-Alg | W1 | 1,052 | 13.9 | 12.6 | 8.6 | 32.1 | 32.8 | – | – | – |
| W1 | W2 | W3 | all | |||||
| Component | ms | % | ms | % | ms | % | ms | % |
| predictor | ||||||||
| features | 9.1 | 1.28 | 9.0 | 0.05 | 10.4 | 0.01 | 9.1 | 0.89 |
| inference | 6.7 | 0.99 | 8.9 | 0.05 | 11.1 | 0.01 | 7.0 | 0.69 |
| decode | 8.6 | 1.31 | 10.6 | 0.06 | 19.0 | 0.01 | 9.0 | 0.90 |
| setBasis | 5.5 | 0.70 | 9.6 | 0.05 | 8.8 | 0.01 | 6.3 | 0.49 |
| baselines | ||||||
| Class | LPs | all-slack | Fan et al. | Lu & Yan | predictor | CostStart-Shift |
| bin packing | 16 | 0.34 | 0.76 | 0.77 | 1.38 | 0.50 |
| crop planning | 4 | 1.04 | 0.58 | 0.63 | 0.46 | 0.65 |
| energy | 21 | 0.56 | 0.54 | 0.64 | 0.47 | 0.50 |
| facility location | 8 | 2.21 | 2.27 | 1.69 | 1.30 | 1.22 |
| graph optimization | 41 | 1.15 | 0.95 | 0.92 | 0.58 | 0.57 |
| Label | time [95% CI] | iterations | summed time |
|---|---|---|---|
| instructions (I) | 0.927 [0.877, 0.978] | 0.943 | 0.918 |
| iterations (N) | 0.953 [0.899, 1.008] | 0.932 | 0.947 |
| wall time (T) | 0.951 [0.907, 0.993] | 0.955 | 0.963 |
| I relative to N | 0.973 [0.934, 1.010] | by repetition 0.9735, 0.9735, 0.9719 | |
| on the 202 LPs without a twin in training | 0.939 [0.886, 0.984] | ||
| I relative to T | 0.974 [0.951, 0.996] | ||
| Method | W1 (1,052) | W2 (267) | W3 (37) | all [95% CI] |
|---|---|---|---|---|
| per-class lookup, restricted actions | 0.585 | 0.479 | 0.663 | 0.537 [0.406, 0.672] |
| per-class lookup, two actions (start or native) | 0.658 | 0.480 | 0.802 | 0.608 [0.460, 0.744] |
| best single action on training (predictor start) | 0.738 | 0.530 | 0.802 | 0.683 [0.497, 0.899] |
| CostStart-Shift | 0.671 | 0.457 | 0.822 | 0.614 [0.466, 0.763] |
| CostStart-Alg | 0.600 | 0.331 | 0.217 | 0.510 |
| CostStart-Full | 0.551 | 0.362 | 0.334 | 0.489 [0.369, 0.619] |
| seed 101 | seed 202 | seed 303 | |
|---|---|---|---|
| predictor | 0.714 | 0.711 | 0.708 |
| + own shift policy | 0.642 | 0.647 | 0.649 |
| + own shift policy, check and harm gate | 0.621 | 0.616 | 0.619 |
| shift policy relative to its predictor | 0.90 | 0.91 [0.85, 0.96] | 0.92 [0.87, 0.96] |
| Method | Decoder or seed | W1 | W2 |
|---|---|---|---|
| Decoder (same model) | |||
| Lu & Yan | our crash | 1.41 | 1.21 |
| top- | 1.82 | 1.72 | |
| Fan et al. | our crash | 1.50 | 2.84 |
| top- | 1.69 | 2.27 (n.s.) | |
| Training seed (full budget, our crash) | |||
| Method | vs. native solver | vs. reference |
|---|---|---|
| Test-NewClass : 234 LPs, 6 classes absent from training (reference: predictor) | ||
| predictor | 1.42 [0.95, 2.30] | – |
| CostStart-Shift , harm gate off (policy abstains on 234/234) | 1.42 [0.96, 2.32] | 1.00 |
| CostStart-Shift | 1.21 [0.97, 1.62] | 0.85 [0.62, 1.08] |
| Fan et al. (full budget) | 1.37 [0.96, 2.09] | – |
| Lu & Yan (full budget) | 0.94 [0.49, 1.70] | – |
| Test-50k (309) | Test-80k (63) | |||
|---|---|---|---|---|
| Method | time [95% CI] | summed | time [95% CI] | summed |
| all-slack dual simplex | 0.94 [0.72, 1.22] | 0.87 | 0.90 [0.63, 1.28] | 1.13 |
| native solver with Devex | 1.06 [0.89, 1.34] (6) | 1.63 | 1.07 [0.93, 1.26] | 1.28 |
| predictor | 0.65 [0.48, 0.87] (1) | 0.72 | 0.83 [0.54, 1.27] (1) | 1.70 |
| predictor, Devex on every LP | 0.66 [0.46, 0.96] | 0.89 | 0.78 [0.48, 1.30] (1) | 2.29 |
| CostStart-Shift | 0.58 [0.46, 0.72] | 0.50 | 0.67 [0.48, 0.88] | 0.84 |
| 0 | 10 | 25 | 50 | 100 | 200 | |
|---|---|---|---|---|---|---|
| 13 classes with at least 220 LPs | 1.098 | 0.965 | 0.952 | 0.946 | 0.934 | 0.924 |
| all classes with enough LPs | 1.076 | 0.944 | 0.932 | 0.929 | 0.912 | 0.924 |
Linear Programming
Linear programming optimizes linear objectives under linear constraints, powering resource allocation, planning, and provable optimization methods.
See all 26 papers