Computation Dag
Bioloupe Forecasting Computation DAG
Section titled “Bioloupe Forecasting 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.
Master DAG Overview
Section titled “Master DAG Overview”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
1. Incidence Calculation DAG
Section titled “1. Incidence Calculation DAG”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]) × RegionalFactorExample:
- Base Incidence: 50,000
- Population 2024: 330M, Population 2030: 345M
- Regional Factor: 1.0
- Result: 50,000 × (345/330) × 1.0 = 52,273
2. Addressable Population DAG
Section titled “2. Addressable Population DAG”2.1 Solid Tumors (Stage-Aware)
Section titled “2.1 Solid Tumors (Stage-Aware)”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% / knownTotaleffectiveMet = 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.
2.2 Hematology (Direct Flow)
Section titled “2.2 Hematology (Direct Flow)”flowchart LR
INC[Year Incidence] --> MULT[×]
HC[Healthcare Access %] --> MULT
MULT --> TA[Therapy Addressable]
Formula:
TherapyAddressable = Incidence × HealthcareAccess%3. Peak Share Calculation DAG
Section titled “3. Peak Share Calculation DAG”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] : 0DelayPenalty = 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%
4. Market Share Over Time DAG
Section titled “4. Market Share Over Time DAG”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 - launchYearuptake = UPTAKE_CURVE[speedToPeak][yearOffset + 1]prevUptake = yearOffset > 0 ? UPTAKE_CURVE[speedToPeak][yearOffset] : 0
weightedShare = (uptake × (13 - launchMonth) + prevUptake × (launchMonth - 1)) ÷ 12
erosionOffset = year - loeYearloeMonth = loeDate.getUTCMonth() + 1preRate = (erosionRates[erosionOffset] ÷ 100) × (13 - loeMonth) ÷ 12postRate = (erosionRates[erosionOffset + 1] ÷ 100) × (loeMonth - 1) ÷ 12erosion = year >= loeYear ? 1 - (preRate + postRate) : 1
effectivePeakShare = peakShare × (classShare / 100)MarketShare = weightedShare × (effectivePeakShare / 100) × erosion5. Patient Flow DAG (Multi-Line)
Section titled “5. Patient Flow DAG (Multi-Line)”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 Rate2L_Pool = 1L_Eligible - (1L_NewPatients × Retreatment)2L_Eligible = 2L_Pool × TransitionRate% × TreatmentRate%2L_NewPatients = 2L_Eligible × MarketShare%
# 3L+ (Third Line and beyond) - NO Treatment Rate3L_Pool = 2L_Eligible - (2L_NewPatients × Retreatment)3L_Eligible = 3L_Pool × TransitionRate%3L_NewPatients = 3L_Eligible × MarketShare%6. Net Price Calculation DAG
Section titled “6. Net Price Calculation DAG”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 - launchYearNetPrice = LaunchPrice × (1 + AnnualPriceChange%)^yearsFromLaunch
# Custom Evolutionprice = LaunchPricefor each year from launch to current: price = price × (1 + netPriceEvolution[i] / 100)NetPrice = price7. Line Sales Calculation DAG
Section titled “7. Line Sales Calculation DAG”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)8. Total Sales Aggregation DAG
Section titled “8. Total Sales Aggregation DAG”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 lines9. Monte Carlo Simulation DAG
Section titled “9. Monte Carlo Simulation DAG”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))
# Normalz = sqrt(-2 × ln(u1)) × cos(2π × u2)value = mean + z × stdDev
# Uniformvalue = 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.
10. Complete End-to-End Flow
Section titled “10. Complete End-to-End Flow”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
Variable Reference Table
Section titled “Variable Reference Table”| Variable | Type | Source | Used In |
|---|---|---|---|
| Base Incidence | Input | User/Database | computeIncidence |
| Population | Reference | population.json | computeIncidence |
| Regional Factor | Reference | eu/jp_incidence.json | computeIncidence |
| Geography | Input | User | All calculations |
| Early Stage % | Input | User | computeAddressableByStage |
| Metastatic % | Input | User | computeAddressableByStage |
| Unknown Stage % | Input | User/Default(0) | computeAddressableByStage |
| Early→Early Relapse % | Input | User | computeAddressableByStage |
| Early→Met Relapse % | Input | User | computeAddressableByStage |
| Healthcare Access % | Input | User/Default | computeAddressableByStage |
| Treatment Rate % | Input | User | calculateLinePatients |
| Transition Rate % | Input | User | calculateLinePatients |
| Retreatment Factor | Input | User | calculateLinePatients |
| Launch Order | Input | User | calculatePeakShare |
| Best in Class | Input | User | calculatePeakShare |
| Delay vs Competition | Input | User | calculatePeakShare |
| Num Competitors | Input | User | calculatePeakShare |
| Class Share % | Input | User | calculateMarketShare |
| Launch Date | Input | User | calculateMarketShare |
| Speed to Peak | Input | User | calculateMarketShare |
| LoE Date | Input | User | calculateMarketShare |
| Molecule Type | Input | User | Erosion lookup |
| Launch Price | Input | User | calculateNetPrice |
| Annual Price Change | Input | User | calculateNetPrice |
| Months of Therapy | Input | User | calculateLineSales |
| Compliance % | Input | User | calculateLineSales |
Computation Dependency Order
Section titled “Computation Dependency Order”- computeIncidence - No dependencies on other computations
- computeAddressableByStage - Depends on: Year Incidence
- calculatePeakShare - No dependencies on other computations
- calculateMarketShare - Depends on: Peak Share
- calculateLinePatients - Depends on: Addressable, Market Share
- calculateNetPrice - No dependencies on other computations
- calculateLineSales - Depends on: Line Patients, Net Price
- calculateTotalSales - Depends on: All Line Sales
- runMonteCarloSimulation - Depends on: All above (runs full pipeline per iteration)