Skip to main content

pyomo-cpsat

A Pyomo direct interface to the CP-SAT solver.

pyomo-cpsat is limited to solving pure integer linear programs with CP-SAT, or optimization models with

  • a linear objective function with real coefficients,
  • linear constraints with integral coefficients, and
  • bounded integer variables.

pyomo-cpsat does not implement other CP-SAT constraint types, such as cumulative constraints, reservoir constraints, etc.

Through a keyword argument, pyomo-cpsat can find infeasible subsystems of constraints for infeasible models, using the approach illustrated here.

pyomo-cpsat is currently experimental - it is based on the future Pyomo solver interface documented here, still under active development.

Examples

Solving a simple model

import pyomo.environ as pyo
from pyomo.contrib.solver.common.factory import SolverFactory
import pyomo_cpsat

model = pyo.ConcreteModel()

model.I = pyo.Set(initialize=[1, 2, 3])
model.w = pyo.Param(model.I, initialize={1: 10, 2: 20, 3: 30})
model.x = pyo.Var(model.I, domain=pyo.Integers, bounds=(0, 100))


def con_rule(model):
    return pyo.quicksum(model.w[i] * model.x[i] for i in model.I) <= 20

model.con = pyo.Constraint(rule=con_rule)

def obj_rule(model):
    return pyo.quicksum(model.x[i] for i in model.I)

model.obj = pyo.Objective(rule=obj_rule, sense=pyo.maximize)

solver = SolverFactory('cpsat')
results = solver.solve(
    model,
    tee=False,          # sets log_search_progress in CP-SAT
    threads=8,          # sets num_workers in CP-SAT
    time_limit=300,     # sets max_time_in_seconds in CP-SAT
    rel_gap=0.1,        # sets relative_gap_limit in CP-SAT
    abs_gap=1e-6,       # sets absolute_gap_limit in CP-SAT
    solver_options={    # passes CP-SAT parameters
        'subsolvers': ['pseudo_costs', 'probing']
    },
)

print(f'Termination condition: {results.termination_condition}')
print(f'Solution status: {results.solution_status}')
print('Solution:')
for i in model.I:
    print(f'  x[{i}] = {pyo.value(model.x[i])}')

Resulting output:

Termination condition: TerminationCondition.convergenceCriteriaSatisfied
Solution status: SolutionStatus.optimal
Solution:
  x[1] = 2
  x[2] = 0
  x[3] = 0

Finding an infeasible subsystem of constraints

import pyomo.environ as pyo
from pyomo.contrib.solver.common.factory import SolverFactory
import pyomo_cpsat

model = pyo.ConcreteModel()

model.I = pyo.Set(initialize=[1, 2, 3])
model.K = pyo.Set(initialize=['a', 'b'])
model.a = pyo.Param(
    model.K,
    model.I,
    initialize={
        ('a', 1): 1,
        ('a', 2): 2,
        ('a', 3): 3,
        ('b', 1): -1,
        ('b', 2): -1,
        ('b', 3): -1,
    },
)
model.b = pyo.Param(
    model.K,
    initialize={'a': 5, 'b': -10},
)

model.x = pyo.Var(model.I, domain=pyo.Integers, bounds=(0, 1))

def con_rule(model, k):
    return pyo.quicksum(model.a[k, i] * model.x[i] for i in model.I) <= model.b[k]

model.con = pyo.Constraint(model.K, rule=con_rule)

def obj_rule(model):
    return pyo.quicksum(model.x[i] for i in model.I)

model.obj = pyo.Objective(rule=obj_rule, sense=pyo.maximize)

solver = SolverFactory('cpsat')
results = solver.solve(model, find_infeasible_subsystem=True)

Resulting output:

Infeasible subsystem of constraints
-----------------------------------
con[b]

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyomo_cpsat-2026.8.11.tar.gz (6.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyomo_cpsat-2026.8.11-py2.py3-none-any.whl (7.5 kB view details)

Uploaded Python 2Python 3

File details

Details for the file pyomo_cpsat-2026.8.11.tar.gz.

File metadata

  • Download URL: pyomo_cpsat-2026.8.11.tar.gz
  • Upload date:
  • Size: 6.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.34.2

File hashes

Hashes for pyomo_cpsat-2026.8.11.tar.gz
Algorithm Hash digest
SHA256 a0430594bad5e5ca01c2e827607564fd1000d167e45839ae8cf0fbd33dc93df7
MD5 c5c43bd865a4170bcd860f211f30c32d
BLAKE2b-256 0962a5760e2aa0c1f73fdede99c4103069af642535188031b7a4e6aebe6d17fc

See more details on using hashes here.

File details

Details for the file pyomo_cpsat-2026.8.11-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for pyomo_cpsat-2026.8.11-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 e48daba04dafa7ee4c9a8fc303f552c73efb22117c979fff58fb0fb85e45e71e
MD5 9a907927d0aede49aa641a173a9e4cbe
BLAKE2b-256 0b2e866ba80aa4f78a58a5695b935983a85dcdc1e7ba216dc0715217fd95509d

See more details on using hashes here.

Release history Release notifications | RSS feed

2026.8.12

2 files

This release

2026.8.11 This release

2 files

2026.1.29

2 files

2026.1.8

2 files

2025.5.1

2 files

2025.5

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page