Skip to content

Computation Dag

Scope: Domain/calculation documentation. For technical architecture (Jotai state, React Query, component patterns), see ARCHITECTURE.md.

Complete Directed Acyclic Graph showing all variables and computation steps.

flowchart TB
    subgraph Inputs["INPUT VARIABLES"]
        direction TB
        BI[Base Incidence]
        POP[Population Data]
        RF[Regional Factor]
        GEO[Geography]
        IND[Indication]

        ES[Early Stage %]
        MS[Metastatic %]
        E2E[Early→Early Relapse %]
        E2M[Early→Met Relapse %]
        HC[Healthcare Access %]

        TR[Treatment Rate %]
        TRANS[Transition Rate %]
        RET[Retreatment Factor]

        LO[Launch Order]
        BIC[Best in Class]
        DVC[Delay vs Competition]
        NC[Num Competitors]
        CS[Class Share %]

        LD[Launch Date]
        STP[Speed to Peak]

        LP[Launch Price]
        APC[Annual Price Change %]
        LOE[LoE Date]
        MT[Molecule Type]

        MOT[Months of Therapy]
        COMP[Compliance %]
    end

    subgraph IncidenceCalc["INCIDENCE CALCULATION"]
        YI[Year Incidence]
    end

    subgraph AddressableCalc["ADDRESSABLE POPULATION"]
        EA[Early Addressable]
        MA[Met Addressable]
        TA[Therapy Addressable]
    end

    subgraph PeakShareCalc["PEAK SHARE CALCULATION"]
        BS[Base Share]
        BICB[BIC Bonus]
        DP[Delay Penalty]
        PS[Peak Share %]
    end

    subgraph MarketShareCalc["MARKET SHARE CALCULATION"]
        YO[Year Offset]
        UV[Uptake Value]
        WS[Weighted Share]
        ER[Erosion Rate]
        MKS[Market Share %]
    end

    subgraph PatientCalc["PATIENT FLOW"]
        E1[1L Eligible]
        NP1[1L New Patients]
        P2[2L Pool]
        E2[2L Eligible]
        NP2[2L New Patients]
        P3[3L+ Pool]
        E3[3L+ Eligible]
        NP3[3L+ New Patients]
    end

    subgraph PriceCalc["NET PRICE CALCULATION"]
        NPE[Net Price Change]
        NP[Net Price]
    end

    subgraph SalesCalc["SALES CALCULATION"]
        LS1[1L Line Sales]
        LS2[2L Line Sales]
        LS3[3L+ Line Sales]
        TS[Total Sales $M]
    end

    %% Incidence Flow
    BI --> YI
    POP --> YI
    RF --> YI
    GEO --> YI

    %% Addressable Flow
    YI --> EA
    YI --> MA
    YI --> TA
    ES --> EA
    ES --> MA
    MS --> MA
    E2E --> EA
    E2M --> MA
    HC --> EA
    HC --> MA
    HC --> TA

    %% Peak Share Flow
    LO --> BS
    NC --> BS
    NC --> BICB
    BIC --> BICB
    DVC --> DP
    BS --> PS
    BICB --> PS
    DP --> PS

    %% Market Share Flow
    LD --> YO
    YO --> UV
    STP --> UV
    UV --> WS
    PS --> WS
    LOE --> ER
    MT --> ER
    WS --> MKS
    ER --> MKS

    %% Patient Flow - 1L
    EA --> E1
    MA --> E1
    TA --> E1
    TR --> E1
    E1 --> NP1
    MKS --> NP1

    %% Patient Flow - 2L
    E1 --> P2
    NP1 --> P2
    RET --> P2
    P2 --> E2
    TRANS --> E2
    TR --> E2
    E2 --> NP2
    MKS --> NP2

    %% Patient Flow - 3L+
    E2 --> P3
    NP2 --> P3
    RET --> P3
    P3 --> E3
    TRANS --> E3
    E3 --> NP3
    MKS --> NP3

    %% Net Price Flow
    LP --> NP
    APC --> NP
    NPE --> NP
    LD --> NP

    %% Sales Flow
    NP1 --> LS1
    NP --> LS1
    COMP --> LS1
    MOT --> LS1

    NP2 --> LS2
    NP --> LS2
    COMP --> LS2
    MOT --> LS2

    NP3 --> LS3
    NP --> LS3
    COMP --> LS3
    MOT --> LS3

    LS1 --> TS
    LS2 --> TS
    LS3 --> TS

flowchart LR
    subgraph Inputs["Inputs"]
        BI[Base Incidence<br/>e.g. 50,000]
        POP_BASE[Base Year Population<br/>e.g. 330M]
        POP_YEAR[Target Year Population<br/>e.g. 345M]
        RF[Regional Factor<br/>USA=1.0, EU5/JP=varies]
    end

    subgraph Calculation["Calculation"]
        PR[Population Ratio<br/>= Pop[Year] / Pop[Base]]
        YI[Year Incidence]
    end

    POP_BASE --> PR
    POP_YEAR --> PR
    BI --> YI
    PR --> YI
    RF --> YI

    subgraph Formula["Formula"]
        F1["YearIncidence = BaseIncidence × PopRatio × RegionalFactor"]
    end

Formula:

YearIncidence = BaseIncidence × (Pop[Year] / Pop[BaseYear]) × RegionalFactor

Example:

  • Base Incidence: 50,000
  • Population 2024: 330M, Population 2030: 345M
  • Regional Factor: 1.0
  • Result: 50,000 × (345/330) × 1.0 = 52,273

flowchart TB
    subgraph Inputs["Inputs"]
        INC[Year Incidence]
        ES[Early Stage %<br/>e.g. 71%]
        MS[Metastatic %<br/>e.g. 23%]
        UNK[Unknown Stage %<br/>e.g. 6%]
        E2E[Early→Early Relapse %<br/>e.g. 15%]
        E2M[Early→Met Relapse %<br/>e.g. 10%]
        HC[Healthcare Access %<br/>e.g. 95%]
    end

    subgraph Normalize["Unknown Redistribution"]
        KNOWN[knownTotal = Early% + Met%]
        EFF_E[effectiveEarly = Early% / knownTotal]
        EFF_M[effectiveMet = Met% / knownTotal]
    end

    subgraph EarlyCalc["Early Addressable"]
        EARLY_BASE[Incidence × effectiveEarly]
        EARLY_RELAPSE[× (1 + E2E%)]
        EARLY_HC[× HC%]
        EA[Early Addressable]
    end

    subgraph MetCalc["Met Addressable"]
        MET_DENOVO[Incidence × effectiveMet]
        MET_RELAPSE[Incidence × effectiveEarly × E2M%]
        MET_TOTAL[Sum]
        MET_HC[× HC%]
        MA[Met Addressable]
    end

    ES --> KNOWN
    MS --> KNOWN
    UNK -.->|reduces known total| KNOWN
    KNOWN --> EFF_E
    KNOWN --> EFF_M

    INC --> EARLY_BASE
    EFF_E --> EARLY_BASE
    EARLY_BASE --> EARLY_RELAPSE
    E2E --> EARLY_RELAPSE
    EARLY_RELAPSE --> EARLY_HC
    HC --> EARLY_HC
    EARLY_HC --> EA

    INC --> MET_DENOVO
    EFF_M --> MET_DENOVO
    INC --> MET_RELAPSE
    EFF_E --> MET_RELAPSE
    E2M --> MET_RELAPSE
    MET_DENOVO --> MET_TOTAL
    MET_RELAPSE --> MET_TOTAL
    MET_TOTAL --> MET_HC
    HC --> MET_HC
    MET_HC --> MA

Formulas (with unknown stage redistribution):

knownTotal = EarlyStage% + MetStage%
effectiveEarly = EarlyStage% / knownTotal
effectiveMet = MetStage% / knownTotal
EarlyAddressable = Incidence × effectiveEarly × (1 + EarlyToEarlyRelapse%) × HealthcareAccess%
MetAddressable = (Incidence × effectiveMet + Incidence × effectiveEarly × EarlyToMetRelapse%) × HealthcareAccess%

When unknownStagePercent = 0, knownTotal = 1.0 and formulas reduce to identity.

flowchart LR
    INC[Year Incidence] --> MULT[×]
    HC[Healthcare Access %] --> MULT
    MULT --> TA[Therapy Addressable]

Formula:

TherapyAddressable = Incidence × HealthcareAccess%

flowchart TB
    subgraph Inputs["Inputs"]
        LO[Launch Order<br/>1-10]
        NC[Num Competitors<br/>1-10]
        BIC[Best in Class<br/>true/false]
        DVC[Delay vs Competition<br/>quarters]
    end

    subgraph BaseShare["Base Share Lookup"]
        LOM[LAUNCH_ORDERS Matrix<br/>10×10]
        BS[Base Share %]
    end

    subgraph BICBonus["Best-in-Class Bonus"]
        BICM[BEST_IN_CLASS Array]
        BICB[BIC Bonus %]
    end

    subgraph DelayPenalty["Delay Penalty"]
        THRESH{Delay > 3?}
        DP[Delay Penalty %]
    end

    subgraph Result["Final Peak Share"]
        PS[Peak Share %<br/>clamped 0-100]
    end

    LO --> LOM
    NC --> LOM
    LOM --> BS

    BIC --> BICM
    NC --> BICM
    BICM --> BICB

    DVC --> THRESH
    THRESH -->|Yes| DP
    THRESH -->|No| ZERO[0]

    BS --> PS
    BICB --> PS
    DP --> PS

Formula:

BaseShare = LAUNCH_ORDERS[launchOrder-1][competitors-1]
BICBonus = bestInClass ? BEST_IN_CLASS[competitors-1] : 0
DelayPenalty = delay > 3 ? delay × 0.5 : 0
PeakShare (within class) = clamp(0, 100, BaseShare + BICBonus - DelayPenalty)
EffectivePeakShare = PeakShare × (ClassShare / 100)

The EffectivePeakShare is used in market share calculations.

Example:

  • Launch Order: 2nd (3 competitors) → Base = 29%
  • Best in Class: Yes → Bonus = +30%
  • Delay: 6 quarters → Penalty = 6 × 0.5 = 3%
  • Peak Share = 29 + 30 - 3 = 56%

flowchart TB
    subgraph Inputs["Inputs"]
        LD[Launch Date<br/>e.g. 2025-08-01]
        YEAR[Current Year]
        STP[Speed to Peak<br/>e.g. "3 Year Medium"]
        PS[Peak Share %]
        LOE[LoE Date]
        MT[Molecule Type]
    end

    subgraph YearOffset["Year Offset"]
        YO[yearOffset = Year - LaunchYear]
    end

    subgraph Uptake["Uptake Curve"]
        UC[UPTAKE_CURVE lookup]
        UV[Uptake Value %]
        PUV[Previous Uptake %]
    end

    subgraph Weighting["Launch Month Weighting"]
        LM[Launch Month]
        WS[Weighted Share]
    end

    subgraph Erosion["LoE Erosion"]
        LOE_YEAR[LoE Year]
        EOD[Erosion Offset]
        ER_LOOKUP[Erosion Lookup<br/>Small Mol vs Biologic]
        ER[Erosion Factor]
    end

    subgraph Result["Market Share"]
        MKS[Market Share %]
    end

    LD --> YO
    YEAR --> YO
    YO --> UC
    STP --> UC
    UC --> UV
    UC --> PUV

    LD --> LM
    UV --> WS
    PUV --> WS
    LM --> WS

    LOE --> LOE_YEAR
    YEAR --> EOD
    LOE_YEAR --> EOD
    MT --> ER_LOOKUP
    EOD --> ER_LOOKUP
    ER_LOOKUP --> ER

    WS --> MKS
    PS --> MKS
    ER --> MKS

Formula:

yearOffset = year - launchYear
uptake = UPTAKE_CURVE[speedToPeak][yearOffset + 1]
prevUptake = yearOffset > 0 ? UPTAKE_CURVE[speedToPeak][yearOffset] : 0
weightedShare = (uptake × (13 - launchMonth) + prevUptake × (launchMonth - 1)) ÷ 12
erosionOffset = year - loeYear
loeMonth = loeDate.getUTCMonth() + 1
preRate = (erosionRates[erosionOffset] ÷ 100) × (13 - loeMonth) ÷ 12
postRate = (erosionRates[erosionOffset + 1] ÷ 100) × (loeMonth - 1) ÷ 12
erosion = year >= loeYear ? 1 - (preRate + postRate) : 1
effectivePeakShare = peakShare × (classShare / 100)
MarketShare = weightedShare × (effectivePeakShare / 100) × erosion

flowchart TB
    subgraph Inputs["Inputs"]
        ADDR[Addressable Population<br/>by category]
        TR[Treatment Rate %]
        MKS[Market Share %]
        TRANS[Transition Rate %]
        RET[Retreatment Factor]
    end

    subgraph Line1["1L (First Line)"]
        E1[1L Eligible<br/>= Addressable × TR%]
        NP1[1L New Patients<br/>= E1 × MarketShare%]
    end

    subgraph Line2["2L (Second Line)"]
        P2[2L Pool<br/>= E1 - NP1 × Retreatment]
        E2_PRE[× Transition%]
        E2[2L Eligible<br/>× TreatmentRate%]
        NP2[2L New Patients<br/>= E2 × MarketShare%]
    end

    subgraph Line3["3L+ (Third Line+)"]
        P3[3L Pool<br/>= E2 - NP2 × Retreatment]
        E3[3L+ Eligible<br/>= P3 × Transition%<br/>NO Treatment Rate]
        NP3[3L+ New Patients<br/>= E3 × MarketShare%]
    end

    ADDR --> E1
    TR --> E1
    E1 --> NP1
    MKS --> NP1

    E1 --> P2
    NP1 --> P2
    RET --> P2
    P2 --> E2_PRE
    TRANS --> E2_PRE
    E2_PRE --> E2
    TR --> E2
    E2 --> NP2
    MKS --> NP2

    E2 --> P3
    NP2 --> P3
    RET --> P3
    P3 --> E3
    TRANS --> E3
    E3 --> NP3
    MKS --> NP3

Formulas:

# 1L (First Line)
1L_Eligible = Addressable × TreatmentRate%
1L_NewPatients = 1L_Eligible × MarketShare%
# 2L (Second Line) - APPLIES Treatment Rate
2L_Pool = 1L_Eligible - (1L_NewPatients × Retreatment)
2L_Eligible = 2L_Pool × TransitionRate% × TreatmentRate%
2L_NewPatients = 2L_Eligible × MarketShare%
# 3L+ (Third Line and beyond) - NO Treatment Rate
3L_Pool = 2L_Eligible - (2L_NewPatients × Retreatment)
3L_Eligible = 3L_Pool × TransitionRate%
3L_NewPatients = 3L_Eligible × MarketShare%

flowchart TB
    subgraph Inputs["Inputs"]
        LP[Launch Price<br/>$/month]
        LY[Launch Year]
        YEAR[Current Year]
        APC[Annual Price Change %]
        NPE[Net Price Change<br/>custom array]
    end

    subgraph Decision["Custom vs Compound"]
        HAS_CUSTOM{Has Custom<br/>Evolution?}
    end

    subgraph CustomPath["Custom Evolution Path"]
        CUMULATIVE[Apply cumulative<br/>year-by-year changes]
    end

    subgraph CompoundPath["Compound Path"]
        YFL[Years from Launch<br/>= Year - LaunchYear]
        COMPOUND[Compound Formula]
    end

    subgraph Result["Net Price"]
        NP[Net Price $/month]
    end

    NPE --> HAS_CUSTOM
    HAS_CUSTOM -->|Yes| CUMULATIVE
    HAS_CUSTOM -->|No| COMPOUND

    LP --> CUMULATIVE
    NPE --> CUMULATIVE
    CUMULATIVE --> NP

    LP --> COMPOUND
    APC --> COMPOUND
    YEAR --> YFL
    LY --> YFL
    YFL --> COMPOUND
    COMPOUND --> NP

Formulas:

# Compound (default)
yearsFromLaunch = year - launchYear
NetPrice = LaunchPrice × (1 + AnnualPriceChange%)^yearsFromLaunch
# Custom Evolution
price = LaunchPrice
for each year from launch to current:
price = price × (1 + netPriceEvolution[i] / 100)
NetPrice = price

flowchart TB
    subgraph Inputs["Inputs"]
        NP_PAT[New Patients]
        NET_PRICE[Net Price $/month]
        COMP[Compliance %]
        MOT[Months of Therapy<br/>distributed across<br/>cohort years]
    end

    subgraph Calculation["Calculation"]
        MULT1[Patients × Price]
        MULT2[× Compliance%]
        MULT3[× Months]
        DIV[÷ 1,000,000]
    end

    subgraph Result["Result"]
        LS[Line Sales $M]
    end

    NP_PAT --> MULT1
    NET_PRICE --> MULT1
    MULT1 --> MULT2
    COMP --> MULT2
    MULT2 --> MULT3
    MOT --> MULT3
    MULT3 --> DIV
    DIV --> LS

Formula:

LineSales ($M) = Σ(CohortPatients[yearOffset] × NetPrice × Compliance% × MonthsThisYear[yearOffset]) ÷ 1,000,000
(Where yearOffset ∈ [0, COHORT_YEARS) and MonthsThisYear ≤ 12 per cohort year)

flowchart TB
    subgraph LineSales["Line Sales"]
        LS1[1L Sales $M]
        LS2[2L Sales $M]
        LS3[3L Sales $M]
        LSN[... more lines]
    end

    subgraph Aggregation["Aggregation"]
        SUM[Sum All Lines]
    end

    subgraph Result["Result"]
        TS[Total Sales $M]
    end

    LS1 --> SUM
    LS2 --> SUM
    LS3 --> SUM
    LSN --> SUM
    SUM --> TS

Formula:

TotalSales = Σ LineSales[i] for all therapy lines

flowchart TB
    subgraph Variables["Simulation Variables"]
        V_INC[Incidence<br/>min/mode/max]
        V_HC[Healthcare Access<br/>min/mode/max]
        V_ES[Early Stage %<br/>min/mode/max]
        V_MS[Met Stage %<br/>min/mode/max]
        V_TR[Treatment Rate<br/>min/mode/max]
        V_PS[Peak Share<br/>min/mode/max]
        V_MOT[Months of Therapy<br/>min/mode/max]
        V_LP[Launch Price<br/>min/mode/max]
    end

    subgraph Sampling["Random Sampling"]
        DIST[Distribution Type<br/>triangular/normal/uniform]
        SAMPLE[Sample Value]
    end

    subgraph Iteration["Per Iteration (1000x)"]
        CLONE[Clone Base Inputs]
        APPLY[Apply Sampled Values]
        CALC[Run Full Sales Calculation]
        COLLECT[Collect Year Sales Array]
    end

    subgraph Analysis["Statistical Analysis"]
        ALL_RESULTS[All Iteration Results<br/>1000 × 20 years]
        P10[Percentile 10]
        P50[Percentile 50 / Median]
        P90[Percentile 90]
        MEAN[Mean]
        TORNADO[Tornado Sensitivity]
    end

    V_INC --> DIST
    V_HC --> DIST
    V_ES --> DIST
    V_MS --> DIST
    V_TR --> DIST
    V_PS --> DIST
    V_MOT --> DIST
    V_LP --> DIST

    DIST --> SAMPLE
    SAMPLE --> APPLY
    CLONE --> APPLY
    APPLY --> CALC
    CALC --> COLLECT
    COLLECT --> ALL_RESULTS

    ALL_RESULTS --> P10
    ALL_RESULTS --> P50
    ALL_RESULTS --> P90
    ALL_RESULTS --> MEAN
    ALL_RESULTS --> TORNADO

Distributions:

# Triangular (most common)
if u <= c:
value = min + sqrt(u × (max-min) × (mode-min))
else:
value = max - sqrt((1-u) × (max-min) × (max-mode))
# Normal
z = sqrt(-2 × ln(u1)) × cos(2π × u2)
value = mean + z × stdDev
# Uniform
value = min + random() × (max - min)

Incidence Evolution Integration: Monte Carlo uses getYearIncidence(year) for each simulated year to apply incidence evolution growth rates from Custom Inputs. This ensures simulations reflect year-over-year incidence changes defined in the Incidence Evolution table.


flowchart TB
    subgraph Stage1["Stage 1: Incidence Info"]
        S1_GEO[Geography]
        S1_IND[Indication]
        S1_BASE[Base Incidence]
        S1_STAGE[Stage Mix]
    end

    subgraph Stage2["Stage 2: Landscape"]
        S2_LINES[Therapy Lines<br/>1L, 2L, 3L...]
        S2_CAT[Categories<br/>early/met/therapy]
    end

    subgraph Stage3["Stage 3: Key Assumptions"]
        S3_LOE[LoE Date]
        S3_MOL[Molecule Type]
        S3_PRICE[Launch Price]
        S3_APC[Annual Price Change]
        S3_LO[Launch Order]
        S3_BIC[Best in Class]
        S3_STP[Speed to Peak]
    end

    subgraph Compute["Computation Layer"]
        C_INC[computeIncidence]
        C_ADDR[computeAddressableByStage]
        C_PS[calculatePeakShare]
        C_MKS[calculateMarketShare]
        C_PAT[calculateLinePatients]
        C_NP[calculateNetPrice]
        C_SALES[calculateLineSales]
    end

    subgraph Stage4["Stage 4: Model Output"]
        S4_PAT[Patients by Line/Year]
        S4_MKS[Market Share by Year]
        S4_SALES[Sales by Line/Year]
        S4_TOTAL[Total Sales]
    end

    subgraph Stage5["Stage 5: Sales Chart"]
        S5_CHART[Stacked Bar Chart]
    end

    subgraph Stage6["Stage 6: Monte Carlo"]
        S6_VARS[Variable Ranges]
        S6_SIM[runMonteCarloSimulation]
        S6_P10[P10 Forecast]
        S6_P50[P50 Forecast]
        S6_P90[P90 Forecast]
        S6_TORNADO[Tornado Chart]
    end

    S1_GEO --> C_INC
    S1_IND --> C_INC
    S1_BASE --> C_INC
    S1_STAGE --> C_ADDR

    C_INC --> C_ADDR

    S3_LO --> C_PS
    S3_BIC --> C_PS

    C_PS --> C_MKS
    S3_STP --> C_MKS
    S3_LOE --> C_MKS
    S3_MOL --> C_MKS

    C_ADDR --> C_PAT
    C_MKS --> C_PAT
    S2_LINES --> C_PAT

    S3_PRICE --> C_NP
    S3_APC --> C_NP

    C_PAT --> C_SALES
    C_NP --> C_SALES
    S2_LINES --> C_SALES

    C_SALES --> S4_PAT
    C_SALES --> S4_MKS
    C_SALES --> S4_SALES
    S4_SALES --> S4_TOTAL

    S4_SALES --> S5_CHART

    S4_SALES --> S6_SIM
    S6_VARS --> S6_SIM
    S6_SIM --> S6_P10
    S6_SIM --> S6_P50
    S6_SIM --> S6_P90
    S6_SIM --> S6_TORNADO

VariableTypeSourceUsed In
Base IncidenceInputUser/DatabasecomputeIncidence
PopulationReferencepopulation.jsoncomputeIncidence
Regional FactorReferenceeu/jp_incidence.jsoncomputeIncidence
GeographyInputUserAll calculations
Early Stage %InputUsercomputeAddressableByStage
Metastatic %InputUsercomputeAddressableByStage
Unknown Stage %InputUser/Default(0)computeAddressableByStage
Early→Early Relapse %InputUsercomputeAddressableByStage
Early→Met Relapse %InputUsercomputeAddressableByStage
Healthcare Access %InputUser/DefaultcomputeAddressableByStage
Treatment Rate %InputUsercalculateLinePatients
Transition Rate %InputUsercalculateLinePatients
Retreatment FactorInputUsercalculateLinePatients
Launch OrderInputUsercalculatePeakShare
Best in ClassInputUsercalculatePeakShare
Delay vs CompetitionInputUsercalculatePeakShare
Num CompetitorsInputUsercalculatePeakShare
Class Share %InputUsercalculateMarketShare
Launch DateInputUsercalculateMarketShare
Speed to PeakInputUsercalculateMarketShare
LoE DateInputUsercalculateMarketShare
Molecule TypeInputUserErosion lookup
Launch PriceInputUsercalculateNetPrice
Annual Price ChangeInputUsercalculateNetPrice
Months of TherapyInputUsercalculateLineSales
Compliance %InputUsercalculateLineSales

  1. computeIncidence - No dependencies on other computations
  2. computeAddressableByStage - Depends on: Year Incidence
  3. calculatePeakShare - No dependencies on other computations
  4. calculateMarketShare - Depends on: Peak Share
  5. calculateLinePatients - Depends on: Addressable, Market Share
  6. calculateNetPrice - No dependencies on other computations
  7. calculateLineSales - Depends on: Line Patients, Net Price
  8. calculateTotalSales - Depends on: All Line Sales
  9. runMonteCarloSimulation - Depends on: All above (runs full pipeline per iteration)