Fast, Monte Carlo DAG propagation simulator with user‑defined delay distributions
Project description
mc_dagprop
mc_dagprop is a fast, Monte Carlo–style propagation simulator for directed acyclic graphs (DAGs),
written in C++ with Python bindings via pybind11. It allows you to model timing networks
(timetables, precedence graphs, etc.) and inject user-defined delay distributions on edges.
Under the hood, we leverage the high-performance utl::random module
for all pseudo-random number generation—offering better speed and quality than the standard library.
Features
- Lightweight & high-performance core in C++
- Simple Python API via poetry or pip
- Custom per-activity-type delay distributions:
- Constant (linear scaling)
- Exponential (scales base duration with cutoff)
- Gamma (shape & scale, to scale base duration)
- Empirical (absolute or relative)
- Absolute: fixed values with weights
- Relative: scaling factors with weights
- Easily extendable (Weibull, etc.)
- Single-run (
run(seed)) and batch-run (run_many([seeds])) - Returns a SimResult: realized times, per-edge durations, and causal predecessors
Note: Defining multiple distributions for the same
activity_typewill override previous settings.
Always set exactly one distribution per activity type.
Installation
# with poetry
poetry add mc_dagprop
# or with pip
pip install mc_dagprop
Quickstart
from mc_dagprop import (
EventTimestamp,
SimEvent,
SimActivity,
SimContext,
GenericDelayGenerator,
Simulator,
)
# 1) Build your DAG timing context
events = [
SimEvent("A", EventTimestamp(0.0, 100.0, 0.0)),
SimEvent("B", EventTimestamp(10.0, 100.0, 0.0)),
]
activities = {
(0, 1): (0,SimActivity(minimal_duration=60.0, activity_type=1)),
}
precedence = [
(1, [(0, 0)]),
]
ctx = SimContext(
events=events,
activities=activities,
precedence_list=precedence,
max_delay=1800.0,
)
# 2) Configure a delay generator (one per activity_type)
gen = GenericDelayGenerator()
gen.add_constant(activity_type=1, factor=1.5) # only one call for type=1
# 3) Create simulator and run
sim = Simulator(ctx, gen)
result = sim.run(seed=42)
print("Realized times:", result.realized)
print("Edge durations:", result.durations)
print("Causal predecessors:", result.cause_event)
API Reference
EventTimestamp(earliest: float, latest: float, actual: float)
Holds the scheduling window and actual time for one event (node):
earliest– earliest possible occurrencelatest– latest allowed occurrenceactual– scheduled (baseline) timestamp
SimEvent(id: str, timestamp: EventTimestamp)
Wraps a DAG node with:
id– string key for the nodetimestamp– anEventTimestampinstance
SimActivity(minimal_duration: float, activity_type: int)
Represents an edge in the DAG:
minimal_duration– minimal (base) durationactivity_type– integer type identifier
SimContext(events, activities, precedence_list, max_delay)
Container for your DAG:
events:List[SimEvent]activities:Dict[(src_idx, dst_idx), SimActivity]precedence_list:List[(target_idx, [(pred_idx, link_idx), …])]max_delay: overall cap on delay propagation
GenericDelayGenerator
Configurable delay factory (one distribution per activity_type):
.add_constant(activity_type, factor).add_exponential(activity_type, lambda_, max_scale).add_gamma(activity_type, shape, scale, max_scale=∞).add_empirical_absolute(activity_type, values, weights).add_empirical_relative(activity_type, factors, weights).set_seed(seed)
Simulator(context: SimContext, generator: GenericDelayGenerator)
.run(seed: int) → SimResult.run_many(seeds: Sequence[int]) → List[SimResult]
SimResult
.realized:NDArray[float]– event times after propagation.durations:NDArray[float]– per-edge durations (base + extra).cause_event:NDArray[int]– which predecessor caused each event
Visualization Demo
pip install plotly
python -m mc_dagprop.utils.demo_distributions
Displays histograms of realized times and delays.
Development
git clone https://github.com/WonJayne/mc_dagprop.git
cd mc_dagprop
poetry install
License
MIT — see LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mc_dagprop-0.3.5.tar.gz.
File metadata
- Download URL: mc_dagprop-0.3.5.tar.gz
- Upload date:
- Size: 32.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.10.4 Windows/10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83528a7589809a9ae4e6b4cb94f39cf19353049ec09970817cb68a984f4f8030
|
|
| MD5 |
84a6a0ff92b3665fd1d8470e5acd1d04
|
|
| BLAKE2b-256 |
1af4f0a1658137ba6673fe73185c090f1f37095d08d3bd96dd8b5c1f15339228
|
File details
Details for the file mc_dagprop-0.3.5-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: mc_dagprop-0.3.5-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 139.6 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.10.4 Windows/10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6be8f2b978de6c656d9c5dd6a7344afe2058fe2c6c5484dbf00d1479582bd59b
|
|
| MD5 |
8cca59bcbfdbeac56c1ade33f4f5c213
|
|
| BLAKE2b-256 |
434815c7aecab174f73e26911fded445388a901b0546dc58d23025cdb21276eb
|