572 lines
16 KiB
Markdown
572 lines
16 KiB
Markdown
<!-- Moved from docs/02-experiments/heartbeat-doe/execution-guide.md to docs/working/experiments/02-experiments/heartbeat-doe/execution-guide.md on 2026-06-16 (docs reorg Phase 2) -->
|
||
# StarForth Heartbeat DoE Experiment – Execution Guide
|
||
|
||
**Date:** November 20, 2025
|
||
**Purpose:** Execute Phase 2 factorial DoE with heartbeat stability metrics
|
||
**Duration:** ~2-4 hours (250 runs = 5 configs × 50 runs each)
|
||
|
||
---
|
||
|
||
## Quick Start
|
||
|
||
```bash
|
||
# Navigate to repo root
|
||
cd /home/rajames/CLionProjects/StarForth
|
||
|
||
# Run the experiment (interactive prompt before execution)
|
||
./scripts/run_factorial_doe_with_heartbeat.sh 2025_11_20_HEARTBEAT_TOP5
|
||
|
||
# Optional: Use custom run count
|
||
./scripts/run_factorial_doe_with_heartbeat.sh --runs-per-config 100 HEARTBEAT_EXTENDED
|
||
|
||
# Analyze results_run_01_2025_12_08 (when complete)
|
||
Rscript scripts/analyze_heartbeat_stability.R
|
||
|
||
# Or with explicit path:
|
||
Rscript scripts/analyze_heartbeat_stability.R ~/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5/experiment_results_heartbeat.csv
|
||
```
|
||
|
||
---
|
||
|
||
## What This Experiment Does
|
||
|
||
### Phase 2: Focus on Heartbeat Stability
|
||
|
||
Building on Stage 1 (3200-run baseline without heartbeat), this experiment:
|
||
|
||
1. **Focuses on 5 elite configurations** (not all 64)
|
||
2. **Re-enables heartbeat thread** (HEARTBEAT_THREAD_ENABLED=1)
|
||
3. **Captures per-tick dynamics:**
|
||
- Heartbeat interval timing (jitter)
|
||
- Cache hit stability (rolling window)
|
||
- Decay slope convergence
|
||
- Load-response coupling
|
||
4. **Measures stability characteristics:**
|
||
- Coefficient of variation in tick interval
|
||
- Outlier ratio (3σ threshold)
|
||
- Convergence rate to steady state
|
||
- Correlation between workload and heartbeat frequency
|
||
|
||
### The 5 Elite Configurations
|
||
|
||
| # | Config | Description | Key Strengths |
|
||
|---|--------|-------------|---|
|
||
| 1 | `1_0_1_1_1_0` | Heat + Decay + Pipelining + Window Inference | Minimal overhead, strong performance |
|
||
| 2 | `1_0_1_1_1_1` | Config #1 + Decay Inference | Full inference pipeline |
|
||
| 3 | `1_1_0_1_1_1` | Heat + Window + Pipelining + Both Inferences | Alternative path (skip decay loop) |
|
||
| 4 | `1_0_1_0_1_0` | Heat + Decay + Window Inference only | Lean configuration |
|
||
| 5 | `0_1_1_0_1_1` | Window + Decay + Both Inferences | Contrast: no heat tracking |
|
||
|
||
**Factor codes:**
|
||
- L1 = ENABLE_LOOP_1_HEAT_TRACKING
|
||
- L2 = ENABLE_LOOP_2_ROLLING_WINDOW
|
||
- L3 = ENABLE_LOOP_3_LINEAR_DECAY
|
||
- L4 = ENABLE_LOOP_4_PIPELINING_METRICS
|
||
- L5 = ENABLE_LOOP_5_WINDOW_INFERENCE
|
||
- L6 = ENABLE_LOOP_6_DECAY_INFERENCE
|
||
|
||
---
|
||
|
||
## Pre-Execution Checklist
|
||
|
||
### 1. Build System Ready
|
||
|
||
```bash
|
||
# Verify build system works
|
||
cd /home/rajames/CLionProjects/StarForth
|
||
make clean
|
||
make fastest
|
||
|
||
# Should complete without errors
|
||
./build/amd64/fastest/starforth -c "1 2 + . BYE"
|
||
```
|
||
|
||
If build fails, troubleshoot:
|
||
- Check compiler: `gcc --version`
|
||
- Verify dependencies: `make check-deps`
|
||
- Clean and retry: `make clean && make fastest`
|
||
|
||
### 2. Storage Space
|
||
|
||
The experiment will generate:
|
||
- **CSV file:** ~50 MB (250 runs × 60+ columns)
|
||
- **Run logs:** ~500 MB (250 separate run logs)
|
||
- **Total:** ~600 MB required
|
||
|
||
Verify space:
|
||
```bash
|
||
mkdir -p /home/rajames/CLionProjects/StarForth-DoE/experiments
|
||
df -h /home/rajames/CLionProjects/StarForth-DoE/
|
||
# Should show at least 1 GB available
|
||
```
|
||
|
||
### 3. System Stability
|
||
|
||
The experiment will run continuously for 2-4 hours. Minimize background load:
|
||
|
||
```bash
|
||
# Check current load
|
||
uptime
|
||
|
||
# Close unnecessary applications
|
||
# - Disable automatic updates
|
||
# - Close heavy browser tabs
|
||
# - Consider running on a dedicated machine
|
||
|
||
# Optional: Run with reduced CPU frequency for more stable heartbeat
|
||
# (Requires sudo; skip if not needed)
|
||
# sudo cpupower frequency-set --governor powersave
|
||
```
|
||
|
||
### 4. Heartbeat Thread Configuration
|
||
|
||
Verify heartbeat is compiled in:
|
||
|
||
```bash
|
||
make clean
|
||
make fastest HEARTBEAT_THREAD_ENABLED=1
|
||
|
||
# Check binary
|
||
nm ./build/amd64/fastest/starforth | grep -i heartbeat
|
||
# Should show heartbeat symbols
|
||
```
|
||
|
||
---
|
||
|
||
## Execution Steps
|
||
|
||
### Step 1: Launch the Experiment
|
||
|
||
```bash
|
||
cd /home/rajames/CLionProjects/StarForth
|
||
|
||
./scripts/run_factorial_doe_with_heartbeat.sh 2025_11_20_HEARTBEAT_TOP5
|
||
```
|
||
|
||
**Output:**
|
||
```
|
||
═══════════════════════════════════════════════════════════
|
||
STARFORTH HEARTBEAT DoE - TOP 5 ELITE CONFIGURATIONS
|
||
═══════════════════════════════════════════════════════════
|
||
→ Factors: 6 feedback loops (LOOP_1 through LOOP_6)
|
||
→ Configurations: 5 elite (selected from Stage 1 baseline)
|
||
→ Runs per config: 50
|
||
→ TOTAL RUNS: 250
|
||
→ Heartbeat metrics: YES (per-tick jitter, convergence, coupling)
|
||
→ Workload: Complete test harness (936+ FORTH tests)
|
||
→ Output: /home/rajames/CLionProjects/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5
|
||
|
||
>>> Generating randomized test matrix...
|
||
✓ Test matrix generated: .../test_matrix.txt
|
||
|
||
Test Matrix Preview (first 10 of 250 runs):
|
||
1_0_1_0_1_0,47
|
||
0_1_1_0_1_1,13
|
||
1_1_0_1_1_1,35
|
||
...
|
||
|
||
→ Complete test matrix saved: .../test_matrix.txt
|
||
Press ENTER to begin execution (Ctrl+C to abort):
|
||
```
|
||
|
||
**At this point:**
|
||
- Review the configuration manifest
|
||
- Verify test matrix looks reasonable (random order)
|
||
- Press ENTER to start
|
||
|
||
### Step 2: Monitor Execution
|
||
|
||
The script will print progress:
|
||
|
||
```
|
||
>>> RANDOMIZED HEARTBEAT EXPERIMENT (250 runs)
|
||
→ Run 1/250 - config 1_0_1_0_1_0 #47...
|
||
[Building configuration...]
|
||
✓ Build successful for 1_0_1_0_1_0
|
||
✓ Run 1/250 completed (12s)
|
||
|
||
→ Run 2/250 - config 0_1_1_0_1_1 #13...
|
||
✓ Run 2/250 completed (11s)
|
||
...
|
||
```
|
||
|
||
**Expected timing:**
|
||
- ~10-15 seconds per run (test harness + heartbeat collection)
|
||
- ~250-375 minutes total (4-6 hours)
|
||
- Builds are cached, only rebuild when config changes
|
||
|
||
**What to monitor:**
|
||
- Are builds succeeding? (OK status)
|
||
- Are runs completing without crashes? (Log lines appearing)
|
||
- Elapsed time tracking (should be ~12s per run on average)
|
||
|
||
### Step 3: Completion
|
||
|
||
When finished:
|
||
|
||
```
|
||
═══════════════════════════════════════════════════════════
|
||
EXPERIMENT COMPLETE
|
||
═══════════════════════════════════════════════════════════
|
||
✓ All runs completed!
|
||
✓ Start time: 2025-11-20T14:30:45
|
||
✓ End time: 2025-11-20T18:15:20
|
||
✓ Total runtime: 3h 44m 35s
|
||
✓ Results: .../experiment_results_heartbeat.csv
|
||
✓ Configs: .../configuration_manifest.txt
|
||
✓ Logs: .../run_logs/
|
||
|
||
CSV Results Preview (first 5 data rows):
|
||
[CSV data shown]
|
||
|
||
→ Next steps:
|
||
1. Download results to analysis repository
|
||
2. Run R analysis: Rscript analyze_heartbeat_stability.R
|
||
3. Identify golden configuration by stability score
|
||
4. Use golden config as baseline for MamaForth/PapaForth
|
||
```
|
||
|
||
---
|
||
|
||
## Post-Execution Analysis
|
||
|
||
### Step 1: Verify CSV Output
|
||
|
||
```bash
|
||
cd /home/rajames/CLionProjects/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5
|
||
|
||
# Check file
|
||
ls -lh experiment_results_heartbeat.csv
|
||
|
||
# Verify header
|
||
head -1 experiment_results_heartbeat.csv
|
||
|
||
# Count rows (should be 251 = header + 250 data rows)
|
||
wc -l experiment_results_heartbeat.csv
|
||
```
|
||
|
||
Expected header includes:
|
||
```
|
||
timestamp,configuration,run_number,...,total_heartbeat_ticks,tick_interval_mean_ns,tick_interval_stddev_ns,tick_interval_cv,...,overall_stability_score
|
||
```
|
||
|
||
### Step 2: Run R Analysis
|
||
|
||
```bash
|
||
cd /home/rajames/CLionProjects/StarForth
|
||
|
||
# Run analysis with explicit path
|
||
Rscript scripts/analyze_heartbeat_stability.R \
|
||
/home/rajames/CLionProjects/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5/experiment_results_heartbeat.csv
|
||
|
||
# Or copy CSV to local directory and run with default
|
||
cp /home/rajames/CLionProjects/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5/experiment_results_heartbeat.csv .
|
||
Rscript scripts/analyze_heartbeat_stability.R
|
||
```
|
||
|
||
**Expected output:**
|
||
```
|
||
Loading data from: .../experiment_results_heartbeat.csv
|
||
|
||
=== DATA SUMMARY ===
|
||
Total runs: 250
|
||
Configurations: 5
|
||
Runs per config: 50
|
||
Columns: 60
|
||
|
||
=== STABILITY RANKINGS ===
|
||
configuration mean_jitter_cv mean_convergence_rate ... rank_stability
|
||
1_0_1_1_1_0 0.0842 123.45 ... 1
|
||
1_0_1_1_1_1 0.0891 118.23 ... 2
|
||
1_1_0_1_1_1 0.1024 95.67 ... 3
|
||
...
|
||
|
||
[Visualizations generated]
|
||
|
||
═══════════════════════════════════════════════════════════
|
||
GOLDEN CONFIGURATION RECOMMENDATION
|
||
═══════════════════════════════════════════════════════════
|
||
|
||
✓ SELECTED: 1_0_1_1_1_0
|
||
|
||
Stability Metrics:
|
||
• Overall Stability Score: 82.45 / 100
|
||
• Heartbeat Jitter (CV): 0.0842 (target < 0.15)
|
||
• Outlier Ratio: 2.34%
|
||
• Convergence Rate: 123.45 (higher = faster)
|
||
• Load Coupling: 0.8234 (target > 0.7)
|
||
• Settling Time: 1245.3 ticks
|
||
• Mean Workload Duration: 12.34 ms
|
||
```
|
||
|
||
### Step 3: Review Generated Files
|
||
|
||
The analysis will create:
|
||
|
||
```
|
||
stability_rankings.csv # Detailed rankings by config
|
||
01_stability_scores.png # Main boxplot comparison
|
||
02_jitter_control.png # CV by config
|
||
03_convergence_speed.png # Convergence comparison
|
||
04_load_coupling.png # Load-response strength
|
||
05_metrics_heatmap.png # Normalized metrics heatmap
|
||
06_tradeoff_jitter_vs_convergence.png # Trade-off visualization
|
||
```
|
||
|
||
**View the visualizations:**
|
||
```bash
|
||
# In terminal or file viewer
|
||
ls -lh *.png
|
||
eog 01_stability_scores.png # Or use your image viewer
|
||
```
|
||
|
||
---
|
||
|
||
## Interpreting Results
|
||
|
||
### Stability Score (Primary Metric)
|
||
|
||
**Range:** 0-100
|
||
|
||
- **0-50:** Unstable, high jitter, poor convergence
|
||
- **50-70:** Acceptable, moderate stability
|
||
- **70-85:** Good, reliable for production
|
||
- **85-100:** Excellent, reference-quality stability
|
||
|
||
The golden configuration should score **≥75**.
|
||
|
||
### Jitter (CV – Coefficient of Variation)
|
||
|
||
**Measure:** Standard deviation / Mean of heartbeat interval
|
||
|
||
**Interpretation:**
|
||
- **CV < 0.10:** Excellent (steady heartbeat, ±10% variation)
|
||
- **0.10-0.15:** Good (±10-15% variation)
|
||
- **0.15-0.20:** Acceptable (±15-20% variation)
|
||
- **> 0.20:** Poor (erratic heartbeat)
|
||
|
||
**Goal:** The golden configuration should have **CV < 0.15**.
|
||
|
||
### Convergence Rate
|
||
|
||
**Measure:** How quickly decay slope fitting reaches steady state
|
||
|
||
**Interpretation:**
|
||
- **Higher values:** Faster convergence
|
||
- **Lower values:** Slower settling, may oscillate
|
||
|
||
The golden configuration should converge within the first 5000 heartbeat ticks.
|
||
|
||
### Load-Response Coupling
|
||
|
||
**Measure:** Correlation between workload intensity and heartbeat interval
|
||
|
||
**Interpretation:**
|
||
- **Correlation > 0.8:** Strong coupling, heartbeat responds proportionally to load
|
||
- **0.7-0.8:** Good coupling, minor lag
|
||
- **< 0.7:** Weak coupling, heartbeat may be unresponsive to load
|
||
|
||
**Goal:** The golden configuration should have **correlation > 0.75**.
|
||
|
||
---
|
||
|
||
## Troubleshooting
|
||
|
||
### Problem: Builds Fail for Certain Configs
|
||
|
||
**Symptom:** Error message during build phase
|
||
```
|
||
✗ Build failed for 1_1_0_1_1_1
|
||
```
|
||
|
||
**Solution:**
|
||
1. Check the build log:
|
||
```bash
|
||
cat run_logs/build_1_1_0_1_1_1.log
|
||
```
|
||
2. Look for compilation errors or missing definitions
|
||
3. Common causes:
|
||
- Missing header includes
|
||
- Circular dependencies between features
|
||
- Undefined macros
|
||
|
||
**Next steps:**
|
||
- Modify the Makefile or source code to fix incompatibility
|
||
- Re-run experiment (builds are skipped if config hasn't changed)
|
||
|
||
### Problem: Runs Crash Mid-Execution
|
||
|
||
**Symptom:** Some runs show segfault or crash
|
||
```
|
||
✗ Configuration 1_1_0_1_1_1 crashed during execution
|
||
```
|
||
|
||
**Solution:**
|
||
1. Check individual run log:
|
||
```bash
|
||
tail -100 run_logs/1_1_0_1_1_1_run_1.log
|
||
```
|
||
2. Look for stack traces or error messages
|
||
3. Common causes:
|
||
- Buffer overflow in heartbeat metrics collection
|
||
- Memory leak in rolling window
|
||
- Race condition in heartbeat thread
|
||
|
||
**Next steps:**
|
||
- If crash is in heartbeat code, check for thread safety issues
|
||
- Run with GDB if deterministic:
|
||
```bash
|
||
gdb --args ./build/amd64/fastest/starforth --doe-experiment
|
||
```
|
||
|
||
### Problem: Analysis Fails (Missing Dependencies)
|
||
|
||
**Symptom:** R script errors
|
||
```
|
||
Error: package 'tidyverse' not found
|
||
```
|
||
|
||
**Solution:**
|
||
```bash
|
||
# Install required R packages
|
||
R --quiet --no-save <<'EOF'
|
||
install.packages(c("tidyverse", "ggplot2", "gridExtra"))
|
||
quit()
|
||
EOF
|
||
|
||
# Then retry:
|
||
Rscript scripts/analyze_heartbeat_stability.R
|
||
```
|
||
|
||
### Problem: Results Look Odd (All Configs Equal)
|
||
|
||
**Symptom:** All stability scores are identical or very similar
|
||
|
||
**Possible causes:**
|
||
1. Heartbeat data not being collected (check DoeMetrics struct)
|
||
2. Heartbeat thread disabled during build (check HEARTBEAT_THREAD_ENABLED=1)
|
||
3. Metrics not being extracted from VM (check metrics_from_vm())
|
||
|
||
**Debug:**
|
||
```bash
|
||
# Verify heartbeat was enabled in build
|
||
nm ./build/amd64/fastest/starforth | grep heartbeat
|
||
# Should show symbols
|
||
|
||
# Check a run log for metrics
|
||
tail -1 run_logs/1_0_1_1_1_0_run_1.log | tr ',' '\n' | nl
|
||
# Should show 60+ columns with numeric values
|
||
```
|
||
|
||
---
|
||
|
||
## Golden Configuration Usage
|
||
|
||
Once identified, the golden configuration should be:
|
||
|
||
1. **Documented:** Create a reference config file
|
||
```bash
|
||
cat > docs/GOLDEN_CONFIG_HEARTBEAT.md <<'EOF'
|
||
# Golden Configuration (Phase 2 Heartbeat)
|
||
|
||
**Config:** [WINNER_HERE]
|
||
**Date:** [COMPLETION_DATE]
|
||
**Stability Score:** [SCORE]
|
||
|
||
Use this configuration as the default for:
|
||
- MamaForth production baseline
|
||
- PapaForth reference physics
|
||
- Future optimization benchmarks
|
||
EOF
|
||
```
|
||
|
||
2. **Locked in build system:** Add to Makefile
|
||
```makefile
|
||
# Golden configuration from Phase 2 DoE (2025-11-20)
|
||
ENABLE_LOOP_1_HEAT_TRACKING ?= 1 # From golden config
|
||
ENABLE_LOOP_2_ROLLING_WINDOW ?= 0
|
||
ENABLE_LOOP_3_LINEAR_DECAY ?= 1
|
||
# ... etc
|
||
```
|
||
|
||
3. **Used as baseline:** Future experiments compare against this
|
||
```bash
|
||
# Experiment Phase 3: Compare new optimizations to golden
|
||
./scripts/run_comparison_doe.sh --baseline GOLDEN --test NEW_FEATURE
|
||
```
|
||
|
||
---
|
||
|
||
## Archive & Handoff
|
||
|
||
After analysis:
|
||
|
||
```bash
|
||
# Create archive of results_run_01_2025_12_08
|
||
cd /home/rajames/CLionProjects/StarForth-DoE/experiments/2025_11_20_HEARTBEAT_TOP5
|
||
|
||
tar czf ../2025_11_20_HEARTBEAT_TOP5.tar.gz \
|
||
experiment_results_heartbeat.csv \
|
||
configuration_manifest.txt \
|
||
experiment_summary.txt
|
||
|
||
# Create analysis report
|
||
cat > ANALYSIS_SUMMARY.txt <<'EOF'
|
||
# StarForth Heartbeat DoE - Analysis Summary
|
||
|
||
**Golden Configuration:** [WINNER]
|
||
**Overall Stability Score:** [SCORE] / 100
|
||
|
||
## Metrics
|
||
- Jitter (CV): [VALUE] (target < 0.15)
|
||
- Convergence Rate: [VALUE] ticks
|
||
- Load Coupling: [VALUE] (target > 0.7)
|
||
- Settling Time: [VALUE] ticks
|
||
|
||
## Interpretation
|
||
[Details about why this config is optimal]
|
||
|
||
## Recommendations
|
||
[Future work based on this config]
|
||
EOF
|
||
|
||
# Archive everything
|
||
tar czf ../2025_11_20_HEARTBEAT_RESULTS_FINAL.tar.gz \
|
||
*.csv *.png *.txt
|
||
|
||
echo "Archive ready: ../2025_11_20_HEARTBEAT_RESULTS_FINAL.tar.gz"
|
||
```
|
||
|
||
---
|
||
|
||
## Next Steps (Phase 3)
|
||
|
||
Once the golden configuration is identified:
|
||
|
||
1. **Lock it in code:** Update CLAUDE.md with golden config
|
||
2. **Create MamaForth baseline:** Use golden config for next experiment
|
||
3. **Plan Phase 3:** Optimization experiments around golden config
|
||
4. **Document learnings:** What made this config optimal?
|
||
|
||
---
|
||
|
||
## Success Criteria
|
||
|
||
✓ All 250 runs completed without segfault
|
||
✓ CSV file has 251 rows (header + 250 data)
|
||
✓ All heartbeat metrics are numeric (not NaN or Inf)
|
||
✓ Stability rankings are clear (no tie for first place)
|
||
✓ R analysis generates all 6 visualizations
|
||
✓ Golden config identified with p < 0.05 significance
|
||
✓ Golden config stability score ≥ 75
|
||
|
||
---
|
||
|
||
## References
|
||
|
||
- **Design:** `docs/DOE_HEARTBEAT_EXPERIMENT_DESIGN.md`
|
||
- **Script:** `scripts/run_factorial_doe_with_heartbeat.sh`
|
||
- **Analysis:** `scripts/analyze_heartbeat_stability.R`
|
||
- **Metrics Schema:** `docs/DOE_METRICS_SCHEMA.md`
|
||
|
||
**Questions?** Review CLAUDE.md or examine run logs for details. |