Skip to main content

Stitchlab Optimization Framework

A standardized framework for building optimization models with multi-solver support. This framework allows you to define optimization models once and easily switch between different solvers without rewriting your model logic.

Overview

The framework is built around two core concepts:

  • Workflow: Orchestrates one or more optimization models to solve complex problems
  • Model: Defines the optimization problem with multiple solver implementations (builders)

Key Features

  • Solver Agnostic: Write your model once, run it with different solvers (OR-Tools CP-SAT, OR-Tools SCIP, PySCIPOpt, etc.)
  • Type Safety: Built with Pydantic for robust data validation
  • Logging: SQLite-based logging for tracking optimization runs
  • Modular Design: Separate concerns between model definition, solving, and workflow orchestration

Quick Start

1. Define Your Model Parameters and Solution

from pydantic import BaseModel
from stitchlab_optimization.builder.model import ModelParams

class SimpleParams(ModelParams):
    pass

class SimpleSolution(BaseModel):
    x: int
    y: int
    objective: float

2. Create Builders for Different Solvers

from stitchlab_optimization.builder.model import ModelBuilder

class SimpleCPSATBuilder(ModelBuilder[SimpleParams, SimpleSolution]):
    def build(self):
        from ortools.sat.python import cp_model
        model = cp_model.CpModel()
        
        self.model_vars = {}
        self.model_vars['x'] = model.NewIntVar(0, 5, 'x')
        self.model_vars['y'] = model.NewIntVar(0, 7, 'y')
        
        model.Add(self.model_vars['x'] + self.model_vars['y'] <= 10)
        model.Maximize(self.model_vars['x'] + self.model_vars['y'])
        
        self._set_model(model)
    
    def construct_solution(self):
        if self.model_output:
            return SimpleSolution(
                x=self.model_output.Value(self.model_vars['x']),
                y=self.model_output.Value(self.model_vars['y']),
                objective=self.model_output.ObjectiveValue()
            )
        return None

3. Register Builders in Your Model

from stitchlab_optimization.builder.model import OptimizationModel
from stitchlab_optimization.solver.engine import SolverEngine

class SimpleModel(OptimizationModel[SimpleParams, SimpleSolution]):
    builders_registry = {
        SolverEngine.ORTOOLS_CPSAT: SimpleCPSATBuilder,
        SolverEngine.ORTOOLS_SCIP: SimpleSCIPBuilder,
        SolverEngine.PYSCIPOPT: SimplePySCIPOPTBuilder
    }

4. Create a Workflow

from stitchlab_optimization.builder.workflow import OptimizationWorkflow

class InputData(BaseModel):
    id: str

class OutputData(SimpleSolution):
    pass

class SimpleWorkflow(OptimizationWorkflow[InputData, OutputData]):
    models_registry = {
        "simple_model": SimpleModel
    }
    
    def execute(self):
        return self.execute_model(
            "simple_model", 
            SimpleParams(), 
            SolverEngine.ORTOOLS_CPSAT
        )

5. Run Your Workflow

from stitchlab_optimization.logger.sqlite_logger import SQLiteLogManager

logger = SQLiteLogManager(db_path="test.db")

payload = InputData(id="1")
workflow = SimpleWorkflow(payload=payload, logger=logger)
output = workflow.invoke()
print(output)

Architecture

Workflow
  ├── Model 1
  │   ├── Builder (Solver A)
  │   ├── Builder (Solver B)
  │   └── Builder (Solver C)
  └── Model 2
      ├── Builder (Solver A)
      └── Builder (Solver B)

Benefits

  1. Easy Solver Switching: Change solvers by modifying a single parameter
  2. Reusability: Define model logic once, use with multiple solvers
  3. Maintainability: Clear separation between model definition and solver implementation
  4. Extensibility: Add new solvers by implementing new builders
  5. Testability: Test different solvers against the same model to compare performance

Supported Solvers

  • OR-Tools CP-SAT
  • OR-Tools SCIP
  • PySCIPOpt
  • GUROBI

Metadata

Release files for stitchlab-optimization 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stitchlab-optimization 0.1.0
File Size Uploaded
stitchlab_optimization-0.1.0.tar.gz 17.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for stitchlab-optimization 0.1.0
File Interpreter ABI Platform
stitchlab_optimization-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 36.0 kB

Release files / stitchlab_optimization-0.1.0.tar.gz

Download URL stitchlab_optimization-0.1.0.tar.gz
Size 17.0 kB
Tags Source
SHA-256 checksum
How to use checksums
eac81bd4d5dcd64373ce7005d92403eded4c2c3ea365a026929835969517756b
BLAKE2b-256 checksum
How to use checksums
1802985709db2cdb57f671ee45134a14444e0d9d7ac4b9ab8d6c8b32400f0e14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release files / stitchlab_optimization-0.1.0-py3-none-any.whl

Download URL stitchlab_optimization-0.1.0-py3-none-any.whl
Size 19.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c65732329d0515f6c975ac702599f8c2cf13d07f975bde031db59a50a7def94a
BLAKE2b-256 checksum
How to use checksums
0cbdc2aa3c8f012b63b2bb123bea1c24a58e6a8b90832bd2061c80e5ea1d2877
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release 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