Science1 publisher3 min readPublished
coinclp brings warm-start simplex solving back to R, four years after clpAPI vanished from CRAN
A from-scratch binding to COIN-OR's Clp reached CRAN on 15 September 2026, bringing back the re-solve-from-a-saved-basis loop that R lost when clpAPI was archived, on a solver its own author says is no longer the fastest.
The Scientist · Science desk
What happened
- coinclp, an R binding to the COIN-OR Clp linear programming solver, was accepted on CRAN on 15 September 2026, with a companion plugin for the R Optimization Infrastructure queued behind it.
- The new package offers three ways in: a single solve call, the full callable library that keeps a model and its basis between solves, and a compatibility layer using clpAPI's own function names.
- The author reports that on Hans Mittelmann's LPopt benchmark as of September 2026, HiGHS finishes 54 of the 65 test problems in the time limit against Clp's 40, at roughly twice the speed.
Compiled by The ScientistSomething wrong?How this is made
Why it matters
- capability Parametric sweeps and column-generation loops can now run in R at simplex speed, keeping the basis that one-call solver interfaces discard on every iteration.
- constraint The LPopt scoreboard cannot decide this choice for a re-solve workload, because it times solvers finishing problems from cold and the author quotes no warm-start comparison.
- decision For a single cold LP the author's own figures point to HiGHS, so the case for coinclp rests on whether a pipeline re-solves a model it has already built.
- exposure One package's unfixed check failures took a healthy dependent down with it six weeks later, which is the maintenance risk an R optimization stack inherits from single-maintainer bindings.
The useful part is the second of the three interfaces. Build a model, keep it in memory, change a bound or a coefficient, hand back the basis, solve again [13]. In the package vignette, a tightened re-solve from a saved basis takes zero iterations [15]. That loop is the thing simplex codes are good at [5], and the package author argues the one-call interfaces of most R solver packages lose it: a parametric study or a column-generation loop that rebuilds the model each iteration throws away exactly the information that makes simplex fast [14].
His release post also has a section on when not to use it. On Hans Mittelmann's LPopt benchmark as of September 2026, HiGHS solves 54 of the 65 test problems within the time limit and Clp solves 40, and HiGHS is about twice as fast on the scaled geometric mean [19]. That is 83 per cent of the set against 62 per cent, a gap of 14 problems [23]. HiGHS, from Julian Hall's group at Edinburgh, is the default LP solver in SciPy and in MATLAB [18]. "Clp is not the fastest open-source LP solver any more, and I would rather say so than have you find out," the author wrote [20].
Those figures score how many problems each solver finishes inside a time limit and how long it takes to get there. The post does not report how the two compare on re-solving a model from a saved basis [24]. So the ranking that makes HiGHS the sensible default for a one-shot solve answers a narrower question than the one a column-generation loop asks.
The bindings are new code written against the current Clp callable library, with registered entry points and external pointers that clean up after themselves, and they build on R 4.5 and 4.6 [10]. Sparse input stays sparse: a Matrix object, a slam triplet matrix or plain i/j/v triplets pass only their non-zero entries, and the package never expands a model into a full grid of mostly zeros first [12]. On Windows the library was already sitting on the machine, because Rtools has shipped Clp since version 4.3, so the missing piece was a few hundred lines of C++ [9].
clpAPI had been on CRAN since 2011, written by Gabriel Gelius-Dietrich at Heinrich Heine University Duesseldorf for the sybil metabolic-modelling toolkit [6]. Its checks started failing, nobody fixed them, and it was archived on 30 November 2021 [7]. ROI.plugin.clp, which Benoit Thieurmel had built on top of it in 2017, had done nothing wrong; it depended on an archived package and followed six weeks later [8]. From that archiving to coinclp's acceptance is four years and nine and a half months [22]. The post does not say what R users solved their models with in between.
The third interface reproduces every function clpAPI exported, same names and same arguments, so an old script needs only a new library() line, and none of clpAPI's code is reused [16]. In ROI the solver is called "coinclp", because ROI takes the name from the package, and the plugin returns duals, reduced costs and row activities alongside the primal solution [17]. That plugin is still in the CRAN submission queue behind the binding itself [2].
What to watch
- Whether ROI.plugin.coinclp clears the CRAN submission queue, since the ROI argument is how most users would reach the solver.
- A published Clp-versus-HiGHS comparison on re-solves from a saved basis, which is the workload the LPopt figures do not cover.
- Whether a second maintainer takes on the bindings, given that the 2021 archiving followed from unfixed check failures.