13 KiB
StarForth Physics Engine - Comprehensive Validation Experiment
Quick Start
Execute the complete 90-run validation experiment:
# Run with default output directory (current directory)
./scripts/run_comprehensive_physics_experiment.sh
# Run with custom output directory
./scripts/run_comprehensive_physics_experiment.sh ./physics_results
# Then analyze results_run_01_2025_12_08
python3 scripts/analyze_physics_experiment.py ./physics_results/experiment_results.csv --output results_run_01_2025_12_08.md
Overview
This document describes how to execute and analyze the comprehensive physics engine validation experiment described in COMPREHENSIVE_PHYSICS_ENGINE_VALIDATION_PROTOCOL.md.
Quick Facts:
- Total Runs: 90 (30 per configuration)
- Configurations: 3 (Baseline, Cache, Full)
- Workload: 100,000 dictionary lookups per run
- Estimated Time: 2-3 hours
- Build Time: 5-10 minutes (3 separate builds)
- Output: CSV with all metrics, per-run logs, analysis report
Prerequisites
System Requirements
- OS: Linux (or compatible POSIX system)
- Architecture: x86_64 (amd64) or ARM64 (aarch64/arm64)
- RAM: 4+ GB
- Disk Space: 500 MB for builds, 50 MB for results
- Build Tools: GCC, Make
- Python: Python 3.6+ (for analysis, optional but recommended)
Verify Build System
cd /home/rajames/CLionProjects/StarForth
# Check Makefile has required flags
grep -E "ENABLE_HOTWORDS_CACHE|ENABLE_PIPELINING" Makefile
# Verify build commands work
make --version
gcc --version
Verify FORTH Commands
Before running the full experiment, verify the benchmark commands exist:
# Build and verify commands
make fastest
./build/amd64/fastest/starforth -c ": test 10 BENCH-DICT-LOOKUP BYE"
If commands are missing, check:
src/word_source/benchmark_words.c- BENCH-DICT-LOOKUP implementationsrc/word_source/physics_cache_words.c- PHYSICS-CACHE-STATS implementationsrc/word_source/physics_pipelining_words.c- PIPELINING-STATS implementationinclude/rolling_window_of_truth.h- ROLLING-WINDOW-STATS implementation
Step-by-Step Execution
Step 1: Prepare Workspace
# Navigate to repository root
cd /home/rajames/CLionProjects/StarForth
# Create output directory
mkdir -p physics_results
cd physics_results
# Verify write permissions
touch test_file && rm test_file
Step 2: Run the Experiment
# From physics_results/ or any directory, run:
../scripts/run_comprehensive_physics_experiment.sh .
# Or from repo root:
./scripts/run_comprehensive_physics_experiment.sh ./physics_results
Expected Output:
════════════════════════════════════════════════════════════
⚡ Building the Fastest Forth in the West! ⚡
════════════════════════════════════════════════════════════
Target Architecture: x86_64 (amd64)
Build Profile: fastest
>>> Building Configuration: A_BASELINE
→ make TARGET=fastest ENABLE_HOTWORDS_CACHE=0 ENABLE_PIPELINING=0
✓ Build completed for A_BASELINE
✓ Binary ready: build/amd64/fastest/starforth
>>> Run 1/30 for A_BASELINE...
✓ Run 1 completed (2.3s)
>>> Run 2/30 for A_BASELINE...
✓ Run 2 completed (2.4s)
...
✓ Configuration A_BASELINE complete (30 runs)
...
✓ All 90 experiments completed successfully!
✓ Results saved to: ./experiment_results.csv
✓ Total runtime: 145 minutes
✓ Run logs: ./run_logs/
Step 3: Monitor Progress
While the experiment runs, you can monitor progress in another terminal:
# Watch the experiment_results.csv grow
watch -n 5 'wc -l experiment_results.csv'
# Check recent run logs
ls -lhrt run_logs/ | tail -10
# See how many runs of each config are done
for config in A_BASELINE B_CACHE C_FULL; do
echo "$config: $(ls run_logs/${config}*.log 2>/dev/null | wc -l) runs"
done
Step 4: Verify Results
# Check CSV was created
head -5 experiment_results.csv
wc -l experiment_results.csv # Should be 91 (1 header + 90 runs)
# Check all runs completed
echo "Configuration A_BASELINE:"
grep "^.*,A_BASELINE," experiment_results.csv | wc -l # Should be 30
echo "Configuration B_CACHE:"
grep "^.*,B_CACHE," experiment_results.csv | wc -l # Should be 30
echo "Configuration C_FULL:"
grep "^.*,C_FULL," experiment_results.csv | wc -l # Should be 30
Step 5: Analyze Results
# Generate markdown report
python3 scripts/analyze_physics_experiment.py experiment_results.csv --output analysis_report.md
# View report
cat analysis_report.md
# Or in markdown viewer if available
mdless analysis_report.md # or pandoc, etc.
Output Files
experiment_results.csv
CSV file with one row per run (90 total rows). Schema:
| Column | Type | Description |
|---|---|---|
| timestamp | ISO8601 | When run started |
| configuration | string | A_BASELINE, B_CACHE, or C_FULL |
| run_number | int | 1-30 |
| total_lookups | int | Iterations executed |
| cache_hits | int | Count of cache hits (if enabled) |
| cache_hit_percent | float | Hit rate percentage |
| bucket_hits | int | Count of bucket hits |
| bucket_hit_percent | float | Bucket hit rate |
| misses | int | Total misses |
| miss_percent | float | Miss rate |
| cache_hit_latency_ns | float | Mean cache hit time (ns) |
| cache_hit_stddev_ns | float | Stddev of cache hits (ns) |
| cache_hit_min_ns | float | Min cache hit latency (ns) |
| cache_hit_max_ns | float | Max cache hit latency (ns) |
| bucket_search_latency_ns | float | Mean bucket search time (ns) |
| bucket_search_stddev_ns | float | Stddev of bucket searches (ns) |
| bucket_search_min_ns | float | Min bucket search latency (ns) |
| bucket_search_max_ns | float | Max bucket search latency (ns) |
| context_predictions_total | int | Total predictions made (pipelining) |
| context_correct | int | Correct predictions (pipelining) |
| context_accuracy_percent | float | Prediction accuracy % |
| window_diversity_percent | float | Pattern diversity captured (%) |
| window_final_size_bytes | int | Final rolling window size (bytes) |
| total_runtime_ms | float | Total execution time (ms) |
| memory_allocated_bytes | int | Memory used (bytes) |
| speedup_vs_baseline | float | Speedup relative to baseline (computed in analysis) |
| ci_lower_95 | float | Lower 95% credible interval |
| ci_upper_95 | float | Upper 95% credible interval |
run_logs/
Directory with one log file per run, named:
A_BASELINE_run_1.logthroughA_BASELINE_run_30.logB_CACHE_run_1.logthroughB_CACHE_run_30.logC_FULL_run_1.logthroughC_FULL_run_30.log
Each log contains complete FORTH output including:
- Benchmark execution output
- PHYSICS-CACHE-STATS results
- PIPELINING-STATS results
- ROLLING-WINDOW-STATS results
- Any error messages
experiment_summary.txt
Summary of experiment execution:
- Start/end timestamps
- Total runtime
- File paths
- Run counts
analysis_report.md (generated)
Markdown report with:
- Executive summary
- Per-configuration statistics
- Comparative analysis (speedup factors)
- Credible intervals
- Success criteria validation
- Hypothesis testing results
- Methodology notes
- Conclusions
Customization
Run Fewer Tests for Validation
To test the infrastructure without running full 90 tests:
# Edit the script and change:
RUNS_PER_CONFIG=5 # Instead of 30
# Or modify directly in script:
./scripts/run_comprehensive_physics_experiment.sh
# Inside script, before RUNS_PER_CONFIG=30 line:
# Uncomment and set to 5 for testing, 30 for full
Use Different Build Profile
Edit the script and change BUILD_PROFILE="fastest" to:
standard- Standard optimized buildfast- Fast build (no LTO)turbo- Turbo build (ASM only)
Change Benchmark Iterations
Edit the script and change BENCH_ITERATIONS=100000 to:
10000- Quick validation test100000- Standard (recommended)1000000- Extended precision test
Adjust Tuning Knobs
Edit the script and add to make command:
# Example: More conservative window shrinking
make TARGET=fastest ENABLE_HOTWORDS_CACHE=1 ENABLE_PIPELINING=1 \
ADAPTIVE_SHRINK_RATE=90 ADAPTIVE_MIN_WINDOW_SIZE=512
# Or more aggressive:
make TARGET=fastest ENABLE_HOTWORDS_CACHE=1 ENABLE_PIPELINING=1 \
ADAPTIVE_SHRINK_RATE=50 ADAPTIVE_MIN_WINDOW_SIZE=128
Troubleshooting
Build Fails
# Check compiler flags
make clean
make TARGET=fastest -n # Dry run to see commands
# Rebuild with verbose output
make clean
make TARGET=fastest VERBOSE=1
# Check recent commits
git log --oneline -10
git diff HEAD
Benchmark Commands Not Found
# Verify word implementations exist
grep -r "BENCH-DICT-LOOKUP" src/
grep -r "PHYSICS-CACHE-STATS" src/
grep -r "PIPELINING-STATS" src/
grep -r "ROLLING-WINDOW-STATS" src/
# Check they're registered
grep -E "BENCH-DICT-LOOKUP|PHYSICS-CACHE-STATS" include/word_registry.h
Metrics Not Parsing
-
Check run log for actual output format:
cat run_logs/A_BASELINE_run_1.log -
Update regex patterns in
scripts/extract_benchmark_metrics.pyto match actual output -
Test extraction manually:
python3 scripts/extract_benchmark_metrics.py run_logs/A_BASELINE_run_1.log A_BASELINE 1
CSV Analysis Fails
# Verify CSV format
head -1 experiment_results.csv
# Check row counts
wc -l experiment_results.csv
# Run analysis with debug
python3 scripts/analyze_physics_experiment.py experiment_results.csv --output report.md -v
Out of Disk Space
# Check available space
df -h
# Clean old builds
make clean
rm -rf build/
# Or delete old results_run_01_2025_12_08
rm -rf physics_results_v1/
Expected Success Criteria
The experiment is successful if:
Configuration A (Baseline)
- ✓ All 30 runs complete without error
- ✓ 100,000 lookups per run executed
- ✓ Consistent execution times (low CV)
- ✓ CSV row for each run with metrics
Configuration B (Cache)
- ✓ Cache hit rate > 20%
- ✓ Speedup > 1.1× vs Baseline (95% CI excludes 1.0)
- ✓ Coefficient of variation < 10% (stable)
- ✓ All 30 runs complete
Configuration C (Full)
- ✓ Prediction accuracy > 60%
- ✓ Speedup > Configuration B
- ✓ Pattern diversity saturation > 90%
- ✓ Window final size < initial size
- ✓ All 30 runs complete
Performance Tips
To optimize experiment runtime:
-
Disable other services:
# Stop background processes to reduce system variability systemctl stop docker # If applicable sudo killall updatedb # Stop file indexing -
Use fastest build profile:
- Already default in script
- Provides maximum determinism
-
Set CPU governor to performance:
# If supported on your system echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor -
Run in dedicated terminal:
- Avoid other terminal I/O during experiment
- Minimize system load
Analysis Tips
When reviewing results:
-
Check Coefficient of Variation (CV):
- CV < 5% = Very stable system
- CV 5-10% = Good stability
- CV > 20% = Investigate variance sources
-
Examine Credible Intervals:
- Narrow CI = Consistent results
- Wide CI = High variance, may need more runs
- CI excludes 1.0 = Statistically significant
-
Validate Metrics:
- Cache hit % should increase in B and C
- Prediction accuracy appears only in C
- Latencies should decrease across configs
-
Check for Outliers:
- Look at min/max in per-config stats
- Large outliers may indicate system interruptions
- Consider removing if documented (power state, GC, etc.)
Publication
When publishing results:
-
Report all three statistics:
- Point estimate (mean)
- 95% credible interval
- Sample size (n=30)
-
Include methodology:
- Describe configurations exactly
- List hardware (CPU, RAM, OS)
- Note any special conditions
-
Provide raw data:
- Include experiment_results.csv in supplementary materials
- Include per-run logs for reproducibility
- Make code available (StarForth is open source)
-
Discuss limitations:
- Deterministic workload (may not reflect real usage)
- Single system (generalizability)
- 30 runs (statistical power)
Further Reading
COMPREHENSIVE_PHYSICS_ENGINE_VALIDATION_PROTOCOL.md- Detailed protocolinclude/physics_hotwords_cache.h- Cache implementationinclude/physics_pipelining_metrics.h- Pipelining metricsinclude/rolling_window_of_truth.h- Rolling window APIinclude/rolling_window_knobs.h- Adaptive control knobs
Last Updated: November 2025 Protocol Version: 1.0 Status: Ready for Execution