Sundew_Diabetes_Commons / test_runtime.py
mgbam's picture
Upload 12 files
ea7d209 verified
#!/usr/bin/env python3
"""Test the PipelineRuntime with DiabetesSignificanceModel"""
from collections import deque
from typing import Dict, Any, Tuple
import numpy as np
# Import Sundew
from sundew.config_presets import get_preset
from sundew.interfaces import ProcessingContext, SignificanceModel
from sundew.runtime import PipelineRuntime, SimpleGatingStrategy, SimpleControlPolicy, SimpleEnergyModel
print("Testing Sundew Diabetes Watch Runtime...")
print("=" * 60)
# Simple test significance model
class TestDiabetesModel(SignificanceModel):
def __init__(self, config):
self.glucose_history = deque(maxlen=12)
def compute_significance(self, context: ProcessingContext) -> Tuple[float, Dict[str, Any]]:
# THIS IS THE FIX - access context.features properly
features = context.features if hasattr(context, 'features') else {}
glucose = float(features.get("glucose_mgdl", 120.0)) if isinstance(features, dict) else 120.0
# Simple risk calc
if glucose < 70:
sig = 0.9
elif glucose > 180:
sig = 0.8
else:
sig = 0.3
return float(sig), {"glucose": glucose}
def update(self, context, outcome):
pass
def get_parameters(self):
return {}
def set_parameters(self, params):
pass
# Create runtime
print("\n1. Creating PipelineRuntime...")
config = get_preset("tuned_v2")
config.target_activation_rate = 0.15
model = TestDiabetesModel({})
runtime = PipelineRuntime(
config=config,
significance_model=model,
gating_strategy=SimpleGatingStrategy(config.hysteresis_gap),
control_policy=SimpleControlPolicy(config),
energy_model=SimpleEnergyModel(
processing_cost=config.base_processing_cost,
idle_cost=config.dormant_tick_cost,
),
)
print("βœ… Runtime created successfully!")
# Test with some data
print("\n2. Testing with sample glucose values...")
test_values = [150, 65, 200, 100, 75, 185]
for i, glucose in enumerate(test_values):
context = ProcessingContext(
timestamp=float(i),
sequence_id=i,
features={
"glucose_mgdl": glucose,
"roc_mgdl_min": 0.0,
},
history=[],
metadata={},
)
result = runtime.process(context)
# THIS IS THE FIX - use correct attribute names
print(f" Event {i}: glucose={glucose} mg/dL, "
f"sig={result.significance:.2f}, "
f"threshold={result.threshold_used:.2f}, "
f"activated={result.activated}")
print("\nβœ… ALL TESTS PASSED!")
print("=" * 60)
print("\nThe fixes are working correctly:")
print(" βœ“ context.features accessed properly")
print(" βœ“ result.threshold_used (not result.threshold)")
print(" βœ“ result.energy_consumed available")
print("\nYou can now run the full Streamlit app!")