#!/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!")