CoolFace
Datasetpublic

Isomorph2026/isomorph-supply-chain-sample

ISOMORPH Sample A single-rollout subset of the ISOMORPH release, intended for users who want to inspect file formats and run loaders before pulling the full dataset. We release multivariate logistics time-series data generated by a digital-twin (DT) simulator of a multi-echelon supply chain with an explicit routing network, with the underlying dynamics formulated as a Markov chain. Overview The simulator advances a directed routing graph of factories, intermediate… See the full description on the dataset page: https://huggingface.co/datasets/Isomorph2026/isomorph-supply-chain-sample.

sourceHugging Faceupdated 4mo agoView on Hugging Face
0likes19downloads
Dataset Card

ISOMORPH Sample

A single-rollout subset of the ISOMORPH release, intended for users who want to inspect file formats and run loaders before pulling the full dataset. We release multivariate logistics time-series data generated by a digital-twin (DT) simulator of a multi-echelon supply chain with an explicit routing network, with the underlying dynamics formulated as a Markov chain.

Overview

The simulator advances a directed routing graph of factories, intermediate warehouses, and a customer-facing destination forward in discrete time. At each step, random Poisson customer demand arrives at the destination, is served from on-hand stock, and triggers replenishment along the network. The network is a directed graph $G=(\mathcal{N},\mathcal{E})$ with three node roles (factories, warehouses, destination), integer per-edge transit times $\taue$, and per-step volume capacities $Ke Ve$; Dijkstra's algorithm routes every shipment. The dynamics form a Markov chain $\xi{t+1} = \Psi(\xit, yt, Lt)$, where $\Psi$ is a deterministic transition map and $(yt, Lt)$ are the only random inputs (Poisson customer demand and Gaussian source lead times). The demand intensity is a five-component sum: yearly seasonality, weekly seasonality, AR(1) drift, per-item bursts, and a shared macro shock that lifts every item's intensity simultaneously. The state vector $\xit$ records on-hand stock, backlog, outstanding orders, in-transit shipments, and a smoothed demand estimate at every location for every item. The released rollout runs on a 13-node US topology (3 sources, 9 warehouses across 5 tiers, NYC destination).

Contents

ItemNotes
manifest.csvOne row, the baseline output_item50 rollout
output_item50/Rollout directory; see File schema below

Rollout summary

  • Family: baseline
  • Catalogue size C = 50 items
  • Horizon T = 52,560 days
  • Seed: 2025
  • All knobs at simulator defaults; see manifest.csv for exact values
  • Approximate on-disk size: ~1.9 GB

Manifest schema

manifest.csv has one row per rollout (just one in this sample) and the following columns:

ColumnMeaning
rolloutRollout name (matches the directory under this variant)
familyOne of baseline, mixture, uq
scenarioScenario label within the family
n_itemsCatalogue size C (50 or 200)
seedRNG seed (2025 here)
horizonLength T in days (52,560 here)
pathRelative path to the rollout directory inside this variant
phi_lo, phi_hiAR(1) coefficient bounds for the demand process
shock_count_scaleMultiplier on per-day shock count
shock_height_scaleMultiplier on shock magnitude
burst_rate_scaleMultiplier on burst arrival rate
burst_height_scaleMultiplier on burst magnitude
containers_scaleMultiplier on edge container counts (capacity)
ss_scaleMultiplier on safety-stock thresholds
leadtime_scaleMultiplier on edge lead times

Three additional simulator knobs are held fixed and therefore omitted from the manifest: seasonal_scale = 1.0, base_lambda_lo = 80.0, base_lambda_hi = 250.0. The exact values are still recorded in output_item50/scenario.json.

File schema

Directory layout:

isomorph_sample/
├── manifest.csv
├── README.md
├── LICENSE
└── output_item50/
    ├── daily_records.parquet
    ├── shipments.parquet
    ├── service_summary.parquet
    ├── inventory_history.parquet
    ├── backlog_history.parquet
    ├── intransit_history.parquet
    ├── demand_signals.npy
    ├── demand_signals_cols.txt
    ├── scenario.json
    ├── edge_list.parquet
    ├── edge_utilisation.npy
    └── edge_saturation.npy

T is the run horizon (52,560 for the released rollout), C is the catalogue size (50), and E is the number of edges in the network.

FileShape / formatContents
daily_records.parquetrows: T x CPer-day, per-item demand and service: day, item, demand, served_from_stock, new_backlog_today, dest_on_hand_end_before_ship, dest_backlog_end_before_ship
shipments.parquetrows: variableOne row per shipment: day, arrival_day, from, to, item, units, path_nodes, edge_times
service_summary.parquetrows: CPer-item totals: total_demand, served_from_stock, new_backlog_added, fill_rate_stock_only
inventory_history.parquetrows: TOn-hand inventory over time
backlog_history.parquetrows: TBacklog over time
intransit_history.parquetrows: TIn-transit units over time
demand_signals.npyarray: T x C, floatItem-level demand series (same content as the demand column of daily_records.csv, dense form)
demand_signals_cols.txttextItem IDs in column order of demand_signals.npy
scenario.jsonJSONExact CLI knobs used to produce the rollout
edge_list.parquetrows: EEdge metadata: edge_id, from, to, travel_time_days, container_volume, num_containers, cap_per_day
edge_utilisation.npyarray: T x E, floatPer-edge fractional utilisation
edge_saturation.npyarray: T x E, floatPer-edge fractional saturation (cap-relative throughput)

Quick load

python
import pandas as pd
import numpy as np

manifest = pd.read_csv("manifest.csv")
row = manifest.iloc[0]

X = np.load(f"{row.path}/demand_signals.npy")          # T x C
cols = open(f"{row.path}/demand_signals_cols.txt").read().strip().split(",")
records = pd.read_parquet(f"{row.path}/daily_records.parquet")

Next step

For the full benchmark (49 rollouts including mixture sweeps and 20 LHS UQ perturbations), see ../isomorph_full/.

Licence

CC-BY-4.0 (see LICENSE).