the behemoth
This commit is contained in:
260
validate_integration.py
Normal file
260
validate_integration.py
Normal file
@@ -0,0 +1,260 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Validation script to demonstrate the complete integration.
|
||||
This shows that all pieces fit together correctly.
|
||||
"""
|
||||
|
||||
from hpcsim.enrichment import Enricher
|
||||
from hpcsim.adapter import normalize_telemetry
|
||||
import json
|
||||
|
||||
|
||||
def validate_task_1():
|
||||
"""Validate Task 1: AI layer receives enriched_telemetry + race_context"""
|
||||
print("=" * 70)
|
||||
print("TASK 1 VALIDATION: AI Layer Input Structure")
|
||||
print("=" * 70)
|
||||
|
||||
enricher = Enricher()
|
||||
|
||||
# Simulate telemetry from Pi
|
||||
raw_telemetry = {
|
||||
'lap_number': 15,
|
||||
'total_laps': 51,
|
||||
'speed': 285.5,
|
||||
'throttle': 88.0,
|
||||
'brake': False,
|
||||
'tire_compound': 'MEDIUM',
|
||||
'tire_life_laps': 12,
|
||||
'track_temperature': 42.5,
|
||||
'rainfall': False,
|
||||
'track_name': 'Monza',
|
||||
'driver_name': 'Alonso',
|
||||
'current_position': 5,
|
||||
'fuel_level': 0.65,
|
||||
}
|
||||
|
||||
# Process through pipeline
|
||||
normalized = normalize_telemetry(raw_telemetry)
|
||||
result = enricher.enrich_with_context(normalized)
|
||||
|
||||
print("\n✅ Input to AI Layer (/api/ingest/enriched):")
|
||||
print(json.dumps(result, indent=2))
|
||||
|
||||
# Validate structure
|
||||
assert 'enriched_telemetry' in result, "Missing enriched_telemetry"
|
||||
assert 'race_context' in result, "Missing race_context"
|
||||
|
||||
enriched = result['enriched_telemetry']
|
||||
context = result['race_context']
|
||||
|
||||
# Validate enriched telemetry fields
|
||||
required_enriched = ['lap', 'aero_efficiency', 'tire_degradation_index',
|
||||
'ers_charge', 'fuel_optimization_score',
|
||||
'driver_consistency', 'weather_impact']
|
||||
for field in required_enriched:
|
||||
assert field in enriched, f"Missing enriched field: {field}"
|
||||
|
||||
# Validate race context structure
|
||||
assert 'race_info' in context, "Missing race_info"
|
||||
assert 'driver_state' in context, "Missing driver_state"
|
||||
assert 'competitors' in context, "Missing competitors"
|
||||
|
||||
# Validate race_info
|
||||
race_info = context['race_info']
|
||||
assert race_info['track_name'] == 'Monza'
|
||||
assert race_info['total_laps'] == 51
|
||||
assert race_info['current_lap'] == 15
|
||||
|
||||
# Validate driver_state
|
||||
driver_state = context['driver_state']
|
||||
assert driver_state['driver_name'] == 'Alonso'
|
||||
assert driver_state['current_position'] == 5
|
||||
assert driver_state['current_tire_compound'] in ['soft', 'medium', 'hard', 'intermediate', 'wet']
|
||||
|
||||
print("\n✅ TASK 1 VALIDATION PASSED")
|
||||
print(" - enriched_telemetry: ✅")
|
||||
print(" - race_context.race_info: ✅")
|
||||
print(" - race_context.driver_state: ✅")
|
||||
print(" - race_context.competitors: ✅")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def validate_task_2():
|
||||
"""Validate Task 2: Enrichment outputs complete race context"""
|
||||
print("\n" + "=" * 70)
|
||||
print("TASK 2 VALIDATION: Enrichment Output Structure")
|
||||
print("=" * 70)
|
||||
|
||||
enricher = Enricher()
|
||||
|
||||
# Test with minimal input
|
||||
minimal_input = {
|
||||
'lap': 10,
|
||||
'speed': 280.0,
|
||||
'throttle': 0.85,
|
||||
'brake': 0.05,
|
||||
'tire_compound': 'medium',
|
||||
'fuel_level': 0.7,
|
||||
}
|
||||
|
||||
# Old method (legacy) - should still work
|
||||
legacy_result = enricher.enrich(minimal_input)
|
||||
print("\n📊 Legacy Output (enrich method):")
|
||||
print(json.dumps(legacy_result, indent=2))
|
||||
assert 'lap' in legacy_result
|
||||
assert 'aero_efficiency' in legacy_result
|
||||
assert 'race_context' not in legacy_result # Legacy doesn't include context
|
||||
print("✅ Legacy method still works (backward compatible)")
|
||||
|
||||
# New method - with context
|
||||
full_input = {
|
||||
'lap': 10,
|
||||
'speed': 280.0,
|
||||
'throttle': 0.85,
|
||||
'brake': 0.05,
|
||||
'tire_compound': 'medium',
|
||||
'fuel_level': 0.7,
|
||||
'track_temp': 42.5,
|
||||
'total_laps': 51,
|
||||
'track_name': 'Monza',
|
||||
'driver_name': 'Alonso',
|
||||
'current_position': 5,
|
||||
'tire_life_laps': 8,
|
||||
'rainfall': False,
|
||||
}
|
||||
|
||||
new_result = enricher.enrich_with_context(full_input)
|
||||
print("\n📊 New Output (enrich_with_context method):")
|
||||
print(json.dumps(new_result, indent=2))
|
||||
|
||||
# Validate new output
|
||||
assert 'enriched_telemetry' in new_result
|
||||
assert 'race_context' in new_result
|
||||
|
||||
enriched = new_result['enriched_telemetry']
|
||||
context = new_result['race_context']
|
||||
|
||||
# Check all 7 enriched fields
|
||||
assert enriched['lap'] == 10
|
||||
assert 0.0 <= enriched['aero_efficiency'] <= 1.0
|
||||
assert 0.0 <= enriched['tire_degradation_index'] <= 1.0
|
||||
assert 0.0 <= enriched['ers_charge'] <= 1.0
|
||||
assert 0.0 <= enriched['fuel_optimization_score'] <= 1.0
|
||||
assert 0.0 <= enriched['driver_consistency'] <= 1.0
|
||||
assert enriched['weather_impact'] in ['low', 'medium', 'high']
|
||||
|
||||
# Check race context
|
||||
assert context['race_info']['track_name'] == 'Monza'
|
||||
assert context['race_info']['total_laps'] == 51
|
||||
assert context['race_info']['current_lap'] == 10
|
||||
assert context['driver_state']['driver_name'] == 'Alonso'
|
||||
assert context['driver_state']['current_position'] == 5
|
||||
assert context['driver_state']['fuel_remaining_percent'] == 70.0 # 0.7 * 100
|
||||
assert len(context['competitors']) > 0
|
||||
|
||||
print("\n✅ TASK 2 VALIDATION PASSED")
|
||||
print(" - Legacy enrich() still works: ✅")
|
||||
print(" - New enrich_with_context() works: ✅")
|
||||
print(" - All 7 enriched fields present: ✅")
|
||||
print(" - race_info complete: ✅")
|
||||
print(" - driver_state complete: ✅")
|
||||
print(" - competitors generated: ✅")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def validate_data_transformations():
|
||||
"""Validate data transformations and conversions"""
|
||||
print("\n" + "=" * 70)
|
||||
print("DATA TRANSFORMATIONS VALIDATION")
|
||||
print("=" * 70)
|
||||
|
||||
enricher = Enricher()
|
||||
|
||||
# Test tire compound normalization
|
||||
test_cases = [
|
||||
('SOFT', 'soft'),
|
||||
('Medium', 'medium'),
|
||||
('HARD', 'hard'),
|
||||
('inter', 'intermediate'),
|
||||
('INTERMEDIATE', 'intermediate'),
|
||||
('wet', 'wet'),
|
||||
]
|
||||
|
||||
print("\n🔧 Tire Compound Normalization:")
|
||||
for input_tire, expected_output in test_cases:
|
||||
result = enricher.enrich_with_context({
|
||||
'lap': 1,
|
||||
'speed': 280.0,
|
||||
'throttle': 0.85,
|
||||
'brake': 0.05,
|
||||
'tire_compound': input_tire,
|
||||
'fuel_level': 0.7,
|
||||
})
|
||||
actual = result['race_context']['driver_state']['current_tire_compound']
|
||||
assert actual == expected_output, f"Expected {expected_output}, got {actual}"
|
||||
print(f" {input_tire} → {actual} ✅")
|
||||
|
||||
# Test fuel conversion
|
||||
print("\n🔧 Fuel Level Conversion (0-1 → 0-100%):")
|
||||
fuel_tests = [0.0, 0.25, 0.5, 0.75, 1.0]
|
||||
for fuel_in in fuel_tests:
|
||||
result = enricher.enrich_with_context({
|
||||
'lap': 1,
|
||||
'speed': 280.0,
|
||||
'throttle': 0.85,
|
||||
'brake': 0.05,
|
||||
'tire_compound': 'medium',
|
||||
'fuel_level': fuel_in,
|
||||
})
|
||||
fuel_out = result['race_context']['driver_state']['fuel_remaining_percent']
|
||||
expected = fuel_in * 100.0
|
||||
assert fuel_out == expected, f"Expected {expected}, got {fuel_out}"
|
||||
print(f" {fuel_in:.2f} → {fuel_out:.1f}% ✅")
|
||||
|
||||
print("\n✅ DATA TRANSFORMATIONS VALIDATION PASSED")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
"""Run all validations"""
|
||||
print("\n" + "🎯" * 35)
|
||||
print("COMPLETE INTEGRATION VALIDATION")
|
||||
print("🎯" * 35)
|
||||
|
||||
try:
|
||||
# Task 1: AI layer receives enriched_telemetry + race_context
|
||||
validate_task_1()
|
||||
|
||||
# Task 2: Enrichment outputs complete race context
|
||||
validate_task_2()
|
||||
|
||||
# Data transformations
|
||||
validate_data_transformations()
|
||||
|
||||
print("\n" + "=" * 70)
|
||||
print("🎉 ALL VALIDATIONS PASSED! 🎉")
|
||||
print("=" * 70)
|
||||
print("\n✅ Task 1: AI layer webhook receives enriched_telemetry + race_context")
|
||||
print("✅ Task 2: Enrichment outputs all expected fields")
|
||||
print("✅ All data transformations working correctly")
|
||||
print("✅ All pieces fit together properly")
|
||||
print("\n" + "=" * 70)
|
||||
|
||||
return True
|
||||
|
||||
except AssertionError as e:
|
||||
print(f"\n❌ VALIDATION FAILED: {e}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"\n❌ ERROR: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
success = main()
|
||||
exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user