Turn your Python model
into a governed cloud sweep.

Combinate is a sweep-specific Python SDK for teams that already have a model. Validate locally, run a bounded parameter sweep in the cloud, and get structured results back without building your own batch glue.

Join Private Beta
For teams and coding agents already working in Python
Try locally, no sign-up
python -m pip install combinate==0.1.0rc2
Local SDK use is open and no-signup; hosted cloud execution is private beta.
First import in your script
from combinate import local_sweep, sweep
Start locally
from combinate import local_sweep, sweep

def simulate(alpha, beta):
    return {"score": alpha * beta}

local = local_sweep(
    simulate,
    params={
        "alpha": [0.1, 0.2, 0.3],
        "beta": [4, 8, 16],
    },
    method="grid",
)
Scale with the same model
cloud = sweep(
    simulate,
    params={
        "alpha": [0.1, 0.2, 0.3],
        "beta": [4, 8, 16],
    },
    method="grid",
)

# same function, same params
best = cloud.succeeded_tasks[0]
print(best.inline_output)
Local validation
Use local_sweep() to validate behavior and output shape before you spend cloud budget.
Bounded execution
Move to hosted execution when one machine stops being enough without rebuilding the workflow.
Structured results
Preflight checks, sweep IDs, and task records make larger runs supportable and reproducible.
Why this exists

Most parameter sweeps start as ordinary Python loops.

Then they turn into brittle scripts, ad hoc multiprocessing, overnight runs, and CSV sprawl. Combinate keeps the model in Python while adding governed execution and supportable result retrieval when the study outgrows one machine.

Product demo

See one sweep go from Python to results.

Watch what happens after submission: Combinate validates the run, fans work out to cloud workers, reports progress, and returns structured results without babysitting queues or infrastructure.

Combinate dev environment
Simulated run
motor_demo.py
from combinate import local_sweep, sweep
def simulate_motor(kp, ki, notch_freq):    return {"cost": kp * 0.4 + ki * 0.7}
params = {"kp": [1.0, 2.0, 3.0], "ki": [0.1, 0.2], "notch_freq": [120, 180]}
local = local_sweep(simulate_motor, params=params, method="grid")
cloud = sweep(simulate_motor, params=params, method="grid")
best = cloud.succeeded_tasks[0].inline_output
Terminal output
Looping
Local validation
Stage 1
How it works

Three steps from local study to cloud sweep.

Keep the model in Python, scale only when you need to, and get structured results back in the same workflow. Agent-assisted setups fit naturally because execution stays bounded, inspectable, and replayable.

Step 01

Write and test the model locally

Keep simulation code and analysis logic in normal Python functions. Use local_sweep() to validate shape, outputs, and sweep behavior before scaling up.

Step 02

Run the same sweep at cloud scale

Switch to hosted execution when the run is too large, too slow, or too expensive for one machine. Combinate handles fan-out, execution limits, and infrastructure details.

Step 03

Retrieve structured results

Sweep IDs, task records, and result artifacts come back as Python objects. Inspect, replay, or extend any run from the SDK or dashboard without losing the experimental trail.

Search strategies

Choose the search strategy that fits the problem.

One Python interface, three fundamentally different ways to explore a parameter space. Pick the one that fits the problem, then change it with a single field.

Grid search
Exhaustive Cartesian product over discrete values. Every combination runs.
Grid
sweep(
    simulate,
    params={
        "lr":     [1e-4, 1e-3, 1e-2],
        "layers": [2, 4, 8],
    },
    sampling_spec={
        "method": "grid",
    },
)
method: grid discrete lists full coverage
Monte Carlo / QMC
Sample a bounded continuous or mixed space with configurable fidelity.
Random
sweep(
    simulate,
    params={
        "alpha": {"type": "range", "min": 0.01,
                  "max": 10.0, "scale": "log"},
        "mode":  ["fast", "precise"],
    },
    sampling_spec={
        "method":  "random",
        "sampler": "sobol",  # or halton, latin_hypercube
        "samples": 64,
        "seed":    42,
    },
)
uniform sobol QMC halton QMC latin hypercube log-scale ranges
Genetic search
Population-based evolutionary optimization. Converges toward an objective over generations.
Genetic
sweep(
    simulate,
    params={
        "lr":   {"type": "range", "min": 1e-5, "max": 0.1},
        "arch": ["resnet", "vit", "mlp"],
    },
    sampling_spec={
        "method":           "genetic",
        "objective_metric": "val_acc",
        "objective_goal":   "maximize",
        "population_size":  8,
        "max_generations":  5,
        "mutation_rate":    0.2,
    },
)
maximize / minimize elite selection adaptive planner mixed param types
Illustrative use cases

The problems Combinate is built for.

These representative scenarios show where parameter sweeps become painful: nested loops stop being manageable, individual evaluations take too long, or a thousand runs need to finish without tying up one machine overnight.

Aerospace Example: ~11 hrs → ~18 min
Propulsion–trajectory co-optimization
Coupled mass-ratio and ascent profile sweep across staging configs, Isp values, and pitch schedules. Each evaluation chains a propulsion model into a trajectory integrator — making parallelism the only practical path to full coverage.
Local
4 nested loops, 720 evals
55s per eval → 11 hrs sequential
Results in hand-labelled CSVs
Hard to replay any single run
Combinate
1 sweep() call, same 720 evals
40 parallel workers could cut wall time to ~18 min
Structured artifact per task
Replay any eval by sweep ID
params = {
    "staging_ratio": [0.08, 0.10, 0.12, 0.14, 0.16],
    "isp_s1": [280, 296, 312, 328, 344, 360],
    "pitch_rate": [1.0, 1.5, 2.0, 2.5],
    "payload_fraction": [0.03, 0.035, 0.04, 0.045, 0.05, 0.055],
}
Finance Example: ~6 hrs → ~35 min
Portfolio stress-test Monte Carlo
Full-repricing VaR across 80 market shock scenarios, each requiring 10,000 correlated paths. Variance reduction via Sobol QMC matters at scale — but only if you can actually run it without hitting local memory limits.
Local
80 scenarios at ~4.5 min each
Memory ceiling at ~50k paths
No reproducibility guarantee
6+ hours, no audit trail
Combinate
Sobol QMC, seeded, per-scenario
12 parallel workers across 80 scenarios
Seed + sweep ID = exact replay
P&L distribution in ~35 min
params = {
    "vol_shift": {"type": "range", "min": -0.3, "max": 0.3},
    "rate_shock_bp": [-100, -50, 0, 50, 100],
    "horizon_days": [1, 5, 10],
}
sampling_spec = {
    "method": "random",
    "sampler": "sobol",
    "samples": 80,
    "seed": 99,
}
Controls Example: 3 days → ~2 hrs
Servo gain schedule genetic search
Nonlinear PID + notch filter tuning for a brushless actuator. Each candidate evaluation runs a full ODE step-response simulation. Manual bisection across five gains is a multi-day slog with no guarantee of finding a global optimum.
Local
Manual trial-and-error, ~90s/eval
Grid over 5 gains = 3,125 evals
No objective tracking across runs
3-day engineering slog
Combinate
Genetic: 8 parallel / generation
Minimize settling time + overshoot
80 generations → about 2 hrs
Can converge in ~2 hours
params = {
    "kp": [0.5, 2.0, 4.0, 8.0, 12.0],
    "ki": [0.0, 0.5, 1.0, 1.5, 2.0],
    "kd": [0.0, 0.1, 0.2, 0.4, 0.8],
    "damping": [0.6, 0.7, 0.8, 0.9, 1.0],
    "notch_freq": [120, 180, 240, 300, 360],
}
sampling_spec = {
    "method": "genetic",
    "objective_metric": "cost",
    "objective_goal": "minimize",
    "population_size": 8,
    "max_generations": 80,
}

Join the private beta.

The first cohort is for engineers and analytical teams who already have Python models and want a repeatable path from local studies to cloud sweeps.

Coming next

Engineering posts, not product announcements.

Each piece answers one concrete question about where Combinate fits and why a governed sweep is different from generic parallelism.

From Nested Python Loops To A Cloud Sweep: What Actually Changes?

The exact behavioral difference between a local study and a governed sweep, with real code.

SciPy QMC Is Great Locally. What Do You Add When You Need Persistence And Governance?

Use a familiar library adjacency to understand where Combinate adds operational value.

What Combinate Does Not Replace In The Python Optimization Ecosystem

See where Combinate fits relative to Ray, Dask, Prefect, Joblib, and optimization libraries without vague platform language.