SimOptDecisions

A Julia framework for simulation-based decision analysis under uncertainty

Author

Doss-Gollin Lab @ Rice CEVE

WarningWork in Progress

This package is under active development and the API may change.

What is SimOptDecisions?

SimOptDecisions is a Julia framework for nonlinear sequential decision problems under uncertainty.

You define a time-stepped simulation model and candidate decision rules. The framework evaluates them across a Monte Carlo ensemble of plausible futures, aggregates outcomes, and optionally searches for Pareto-optimal policies using multi-objective optimization. It is designed for problems where closed-form solutions are unavailable and simulation-based evaluation is the natural approach.

How It Works

The framework is built around nested loops. Both explore() and optimize() call simulate() at their core:

┌────────┐  ┌──────────┐  ┌──────────┐
│ Config │  │ Scenarios│  │ Policies │
└───┬────┘  └────┬─────┘  └────┬─────┘
    │            │             │
    ▼            ▼             ▼
┌───────────────────────────────────────────────────────────────┐
│  explore(config, scenarios, policies)                         │
│  ─ OR ─                                                       │
│  optimize(config, scenarios, policy_type, ...)                │
│                                                               │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │ for each (policy, scenario) combination                 │  │
│  │                                                         │  │
│  │  simulate(config, scenario, policy)                     │  │
│  │  ┌───────────────────────────────────────────────────┐  │  │
│  │  │   initialize()      ───►  State                   │  │  │
│  │  │   time_axis()       ───►  times                   │  │  │
│  │  │                                                   │  │  │
│  │  │   ┌─────────────────────────────────────────────┐ │  │  │
│  │  │   │ for t in times                              │ │  │  │
│  │  │   │   get_action()    ───►  Action              │ │  │  │
│  │  │   │   run_timestep()  ───►  State, StepRecord   │ │  │  │
│  │  │   └─────────────────────────────────────────────┘ │  │  │
│  │  │                                                   │  │  │
│  │  │   compute_outcome()   ───►  Outcome               │  │  │
│  │  └───────────────────────────────────────────────────┘  │  │
│  └─────────────────────────────────────────────────────────┘  │
└───────────────────────────────────────────────────────────────┘
Option What it controls Choices
executor How to run simulations SequentialExecutor(), ThreadedExecutor(), DistributedExecutor()
backend Where to store results InMemoryBackend(), ZarrBackend(path)
trace Save full simulation history true / false (default)

Why SimOptDecisions?

Many decision problems—infrastructure sizing, climate adaptation, resource management—involve nonlinear dynamics, sequential decisions over time, and uncertainties that require Monte Carlo evaluation. SimOptDecisions handles the computational infrastructure so you can focus on your model:

  • You write: the system model (run_timestep), uncertainty characterization (Scenarios), and decision rules (Policies)
  • Framework handles: parallel execution, result storage, exploratory analysis, and multi-objective Pareto optimization

Installation

Requires Julia 1.10 or later.

using Pkg
Pkg.add(url="https://github.com/dossgollin-lab/SimOptDecisions")

Who Is This For?

SimOptDecisions is designed for researchers and practitioners working on simulation-based decision problems under uncertainty—particularly in climate risk management, water resources, infrastructure planning, and environmental policy. The Concepts section introduces the key ideas; the Tutorial walks through a complete worked example.

Next Steps

Concepts — Key vocabulary and ideas

Tutorial — Learn SimOptDecisions through a complete worked example (house elevation under flood risk)

Quick Reference — Checklist of types and functions to implement