Clp

Layer 1 - COIN-OR Linear Programming Solver

Layer 1

Clp — COIN-OR Linear Programming

Clp (COIN-OR Linear Programming) is a high-quality open-source LP solver that rivals commercial solvers. It's the LP engine inside Cbc, meaning every MIP solved by Cbc uses Clp for its LP relaxations.

Layer 1 | 86 files | 13 with algorithm annotations


Why Clp Matters

Every major optimization solver needs a reliable LP solver at its core:

Clp provides this foundation with both simplex and interior point methods.


Algorithms Implemented

Dual Simplex Method

The workhorse for re-optimization. Clp's dual simplex maintains dual feasibility while working toward primal feasibility — ideal for:

Key features:

Primal Simplex Method

Classic simplex maintaining primal feasibility. Use when:

Interior Point (Barrier) Method

Alternative to simplex for very large or dense problems:


Key Classes

ClassPurpose
ClpSimplex Main simplex solver class
ClpSimplexDual Dual simplex implementation
ClpSimplexPrimal Primal simplex implementation
ClpInterior Interior point (barrier) solver
ClpModel LP model storage
ClpFactorization Basis factorization (wraps CoinFactorization)

Architecture

Clp uses a "mix-in" design where ClpSimplexDual and ClpSimplexPrimal inherit from ClpSimplex but add no data — they're cast types that provide algorithm-specific methods.

ClpModel          <- Problem data (A, b, c, bounds)
    |
ClpSimplex        <- Core simplex infrastructure
    |
+---+---+
|       |
Dual  Primal     <- Algorithm-specific pivot rules

The solver maintains:


Usage Example

#include "ClpSimplex.hpp"

// Create model and read problem
ClpSimplex model;
model.readMps("problem.mps");

// Solve using dual simplex (default for most problems)
model.dual();

// Or use primal simplex
// model.primal();

// Or interior point
// model.barrier();

// Get solution
const double* solution = model.primalColumnSolution();
double objectiveValue = model.objectiveValue();

When to Use Clp

ScenarioRecommendation
Standalone LPDual simplex (default)
Inside branch-and-boundDual simplex with warm start
Very large dense LPInterior point
First solve, no warm startEither; interior point may be faster
Re-optimization after cutsDual simplex

Performance Tips

  1. Presolve: Always use model.initialSolve() which includes presolve
  2. Scaling: Enable scaling for numerically difficult problems
  3. Factorization frequency: Tune factorizationFrequency for stability vs. speed
  4. Crash: Use crash option to find good initial basis quickly

Classes