Skip to content

Commit 4d7c1e0

Browse files
committed
feat: add experiment 1
1 parent b2c1ac5 commit 4d7c1e0

File tree

11 files changed

+746
-127
lines changed

11 files changed

+746
-127
lines changed

Makefile

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: up down clean-volumes restart build logs help run test setup install-dev clean-env verify
1+
.PHONY: up down clean-volumes restart build logs help run test setup install-dev clean-env verify experiment experiment-down
22

33
# Default target
44
.DEFAULT_GOAL := help
@@ -77,6 +77,60 @@ up-debug: clean-volumes
7777
## run: Alias for 'up' (accepts config parameter)
7878
run: up
7979

80+
## experiment: Run an experiment (make experiment name=<experiment_name>)
81+
experiment: clean-volumes
82+
@if [ -z "$(name)" ]; then \
83+
echo "❌ Error: Please provide experiment name: make experiment name=my_experiment"; \
84+
exit 1; \
85+
fi
86+
@if [ ! -f "config/experiments/$(name).yaml" ]; then \
87+
echo "❌ Error: Experiment config not found: config/experiments/$(name).yaml"; \
88+
echo ""; \
89+
echo "Available experiments:"; \
90+
ls -1 config/experiments/*.yaml 2>/dev/null | xargs -n 1 basename | sed 's/.yaml//' | sed 's/^/ - /' || echo " (none)"; \
91+
exit 1; \
92+
fi
93+
@echo "🧪 Starting experiment: $(name)"
94+
@echo "📋 Using config: config/experiments/$(name).yaml"
95+
@mkdir -p output/$(name)
96+
EXPERIMENT_NAME=$(name) CONFIG_PATH=./config/experiments/$(name).yaml docker compose up -d
97+
@echo "✅ Experiment started!"
98+
@echo ""
99+
@echo "Experiment: $(name)"
100+
@echo "Output: output/$(name)/"
101+
@echo ""
102+
@echo "View logs: make logs-sim-worker"
103+
104+
## experiment-debug: Run an experiment with debug mode enabled (make experiment-debug name=<experiment_name>)
105+
experiment-debug: clean-volumes
106+
@if [ -z "$(name)" ]; then \
107+
echo "❌ Error: Please provide experiment name: make experiment-debug name=my_experiment"; \
108+
exit 1; \
109+
fi
110+
@if [ ! -f "config/experiments/$(name).yaml" ]; then \
111+
echo "❌ Error: Experiment config not found: config/experiments/$(name).yaml"; \
112+
echo ""; \
113+
echo "Available experiments:"; \
114+
ls -1 config/experiments/*.yaml 2>/dev/null | xargs -n 1 basename | sed 's/.yaml//' | sed 's/^/ - /' || echo " (none)"; \
115+
exit 1; \
116+
fi
117+
@echo "🧪🐛 Starting experiment with DEBUG mode: $(name)"
118+
@echo "📋 Using config: config/experiments/$(name).yaml"
119+
@mkdir -p output/$(name)
120+
EXPERIMENT_NAME=$(name) DEBUG_MODE=true CONFIG_PATH=./config/experiments/$(name).yaml docker compose up -d
121+
@echo "✅ Experiment started in debug mode!"
122+
@echo ""
123+
@echo "Experiment: $(name)"
124+
@echo "Output: output/$(name)/"
125+
@echo "Debug files: output/$(name)/run_*/"
126+
@echo ""
127+
@echo "View logs: make logs-sim-worker"
128+
129+
## experiment-down: Stop experiment services
130+
experiment-down:
131+
docker compose down
132+
@echo "✅ Experiment stopped"
133+
80134
## down: Stop all containers
81135
down:
82136
@echo "⏹️ Stopping OpenDT services..."
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
workload: "SURF"
2+
3+
simulation:
4+
# 1.0 = Realtime, -1 = Max Speed
5+
speed_factor: 300
6+
window_size_minutes: 15
7+
heartbeat_cadence_minutes: 1
8+
# Experiment mode: write results to parquet instead of Kafka
9+
experiment_mode: true
10+
11+
features:
12+
calibration_enabled: false
13+
14+
kafka:
15+
bootstrap_servers: "kafka:29092"
16+
topics:
17+
workload:
18+
name: "dc.workload"
19+
config:
20+
# 24 hours
21+
retention.ms: "86400000"
22+
power:
23+
name: "dc.power"
24+
config:
25+
# 1 hour
26+
retention.ms: "3600000"
27+
topology:
28+
name: "dc.topology"
29+
config:
30+
# Compacted topic - keeps latest topology
31+
cleanup.policy: "compact"
32+
# Keep at least 1 hour
33+
min.compaction.lag.ms: "3600000"
34+
system:
35+
name: "sys.config"
36+
config:
37+
cleanup.policy: "compact"
38+
results:
39+
name: "sim.results"
40+
config:
41+
# 7 days retention for simulation results
42+
retention.ms: "604800000"

docker-compose.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,12 @@ services:
132132
KAFKA_BOOTSTRAP_SERVERS: kafka:29092
133133
CONFIG_FILE: /app/config/simulation.yaml
134134
PYTHONUNBUFFERED: 1
135-
# Debug mode: set to "true" to write results to files instead of Kafka
135+
# Debug mode: set to "true" to write debug files alongside main output
136136
DEBUG_MODE: ${DEBUG_MODE:-false}
137137
DEBUG_OUTPUT_DIR: /app/output
138+
# Experiment mode: experiment name (used for output directory)
139+
EXPERIMENT_NAME: ${EXPERIMENT_NAME:-default}
140+
EXPERIMENT_OUTPUT_DIR: /app/output
138141
volumes:
139142
# Mount source code for hot reload
140143
- ./services/sim-worker:/app/services/sim-worker

libs/common/opendt_common/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class SimConfig(BaseModel):
4747
heartbeat_cadence_minutes: int = Field(
4848
default=1, description="Cadence in simulation minutes for workload heartbeat messages", gt=0
4949
)
50+
experiment_mode: bool = Field(
51+
default=False,
52+
description="Enable experiment mode (write results to parquet instead of Kafka)",
53+
)
5054

5155
@field_validator("speed_factor")
5256
@classmethod

pyproject.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@ dependencies = [
88
"pandas>=2.0.0",
99
"pyarrow>=13.0.0",
1010
"pyyaml>=6.0.0",
11-
11+
"matplotlib>=3.7.0",
12+
1213
# Kafka (used by most services)
1314
"kafka-python>=2.0.2",
14-
15+
1516
# Validation
1617
"pydantic>=2.0.0",
1718
"pydantic-settings>=2.0.0",
18-
19+
1920
# Web framework (for API service)
2021
"fastapi>=0.104.0",
2122
"uvicorn[standard]>=0.24.0",
22-
23+
2324
# Database (for services that need it)
2425
"psycopg2-binary>=2.9.0",
2526
"sqlalchemy>=2.0.0",

0 commit comments

Comments
 (0)