Skip to main content

StitchLab Optimization application

Project description

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

Project details


Download files

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

Source Distribution

stitchlab_optimization-0.0.5.tar.gz (16.6 kB view details)

Uploaded Source

Built Distribution

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

stitchlab_optimization-0.0.5-py3-none-any.whl (19.5 kB view details)

Uploaded Python 3

File details

Details for the file stitchlab_optimization-0.0.5.tar.gz.

File metadata

  • Download URL: stitchlab_optimization-0.0.5.tar.gz
  • Upload date:
  • Size: 16.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for stitchlab_optimization-0.0.5.tar.gz
Algorithm Hash digest
SHA256 7f6fea03821b9279368c2519303b9def7799063b426bfd878dfa45b7549ceefd
MD5 ab9695159bca1d849c6bd3d1eb0f50a2
BLAKE2b-256 f0c418f47b7f747c666611f2e01e4cf0ab68a404799bfc6c32c54d1a80fb6de1

See more details on using hashes here.

File details

Details for the file stitchlab_optimization-0.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for stitchlab_optimization-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 c6e050a0b067125067f43d0480484a85a524c7605cb40376e3141bf3f39a64b0
MD5 32c256a760b1de4b1dd3ec7e1c1d4161
BLAKE2b-256 863404afb155debf01f1d018dc3531e3138c884d73cf6ec71c2c787bef8d8836

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page