English
sofia-engine
edge-ai
industrial-ai
scientific-computing
embedded-ai
signal-processing
digital-signal-processing
predictive-maintenance
condition-monitoring
vibration-analysis
anomaly-detection
industrial-iot
iiot
telemetry
edge-computing
tinyml
on-device-learning
embedded-systems
machine-health
time-series
python
typescript
c
File size: 3,706 Bytes
876458a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | """Basic Inference Example for Sofia Engine.
Demonstrates deterministic telemetry feature extraction, statistical anomaly
detection, and evidence-based diagnostic health scoring.
Run:
python examples/basic_inference.py
"""
from __future__ import annotations
import numpy as np
from sofia_ai.core.contracts import DataQuality, FeatureVector, SignalWindow
from sofia_ai.diagnostics.engine import (
DiagnosticEngine,
HealthEvent,
HealthScore,
compute_health_score,
)
from sofia_ai.diagnostics.rules import RuleContext
from sofia_ai.features import extract_from_array
from sofia_ai.inference.detectors import ThresholdDetector, build_manifest_for
def run_basic_inference() -> None:
print("=== Sofia Engine: Basic Inference Example ===")
# 1. Synthesize 1 second of vibration telemetry (fs = 1000 Hz, 25 Hz shaft rotation)
fs = 1000.0
t = np.arange(1000) / fs
rng = np.random.default_rng(42)
# 25 Hz fundamental + 50 Hz harmonic + Gaussian background noise
raw_signal = (
0.45 * np.sin(2 * np.pi * 25.0 * t)
+ 0.15 * np.sin(2 * np.pi * 50.0 * t)
+ 0.05 * rng.normal(size=len(t))
)
print(f"Input Signal: {len(raw_signal)} samples @ {fs} Hz ({len(raw_signal)/fs:.2f} s)")
# 2. Package into a validated SignalWindow
window = SignalWindow(
values=raw_signal,
sample_rate=fs,
device_id="pump-motor-01",
channel="vibration_de",
unit="m/s^2",
quality=DataQuality.GOOD,
)
# 3. Extract versioned feature vector (14 statistical + spectral metrics)
features: FeatureVector = extract_from_array(
window.values,
window.sample_rate,
channel=window.channel,
quality=window.quality,
)
# 4. Verify feature schema version (v3.0)
features.validate_schema("3.0")
print(f"Extracted FeatureVector (schema {features.schema_version}): {len(features.names)} features")
for name, val in list(zip(features.names, features.values, strict=True))[:5]:
print(f" - {name}: {val:.4f}")
# 5. Anomaly detection via ThresholdDetector (monitoring vibration RMS)
detector = ThresholdDetector(feature="rms", high=0.45)
manifest = build_manifest_for(detector, model_id="rms_threshold_v1", version="1.0.0")
detector.load(manifest)
inference_result = detector.infer(features)
print("\n--- Inference Result (Threshold Detector) ---")
print(f"Monitored Feature: 'rms' = {inference_result.score:.4f} m/s^2 (high limit = 0.45)")
print(f"Outcome: {inference_result.outcome.name}")
print(f"Confidence: {inference_result.confidence:.2%}")
# 6. Diagnostic Engine: Convert inference into evidence-backed health event
diag_engine = DiagnosticEngine()
context = RuleContext(
device_id=window.device_id,
channel=window.channel,
score=inference_result.score,
confidence=inference_result.confidence,
unit="z-score",
)
event: HealthEvent | None = diag_engine.evaluate(context)
events = [event] if event else []
health_score: HealthScore = compute_health_score(events)
print("\n--- Health Assessment ---")
print(f"Health Score: {health_score.score:.1f} / 100.0")
print(f"Credible Interval: [{health_score.lower:.1f}, {health_score.upper:.1f}]")
print(f"Uncertainty: ±{health_score.uncertainty:.2%}")
if event:
print(f"Health Event: {event.event_type} (Severity: {event.severity.name})")
print(f"Recommendation: {event.recommendation}")
else:
print("Status: Nominal operating condition.")
if __name__ == "__main__":
run_basic_inference()
|