File size: 5,180 Bytes
f381be8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Architecture Overview

## System Architecture

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Docker Container (port 7860)                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  React SPA   β”‚  Gradio UI    β”‚  FastAPI Backend                  β”‚
β”‚  (static)    β”‚  /gradio      β”‚  /api/*     /docs     /health     β”‚
β”‚  /           β”‚               β”‚                                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                      Model Registry                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚  β”‚Classical β”‚  β”‚ LSTMΓ—4   β”‚  β”‚Transform.β”‚  β”‚ Ensemble β”‚          β”‚
β”‚  β”‚ models   β”‚  β”‚ GRU      β”‚  β”‚ GPT, TFT β”‚  β”‚ Stack/WA β”‚          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                  Data Pipeline (src/)                              β”‚
β”‚  loader.py β†’ features.py β†’ preprocessing.py β†’ model training     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                 NASA PCoE Dataset (cleaned_dataset/)              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

## Data Flow

1. **Ingestion:** `loader.py` reads metadata.csv + per-cycle CSVs
2. **Feature Engineering:** `features.py` computes SOC, SOH, RUL, scalar features per cycle
3. **Preprocessing:** `preprocessing.py` creates sliding windows, scales features, splits by battery
4. **Training:** Notebooks train each model family, save checkpoints to `artifacts/models/`
5. **Serving:** `model_registry.py` loads all models at startup
6. **Prediction:** API receives features β†’ registry dispatches to best model β†’ returns SOH/RUL
7. **Simulation:** `POST /api/v2/simulate` receives multi-battery config β†’ vectorized Arrhenius degradation + ML via `predict_array()` β†’ returns per-step SOH, RUL, and degradation-state history for each battery
8. **Visualization:** Frontend fetches results and renders analytics (fleet overview, compare, temperature analysis, recommendations)

## Model Registry

The `ModelRegistry` singleton:
- Scans `artifacts/models/classical/` for `.joblib` files (sklearn/xgb/lgbm)
- Scans `artifacts/models/deep/` for `.pt` (PyTorch) and `.keras` (TF) files
- Loads classical models eagerly; deep models registered lazily
- Selects default model by priority: XGBoost > LightGBM > RandomForest > Ridge > deep models
- Provides unified `predict()` interface regardless of framework
- `predict_array(X: np.ndarray, model_name: str)` batch method enables vectorized simulation: accepts an (N, n_features) array and returns predictions for all N cycles in one call, avoiding Python loops
- `_x_for_model()` normalizes input feature extraction for both single-cycle and batch paths
- `_load_scaler()` lazily loads per-model scalers from `artifacts/scalers/`

## Frontend Architecture

- **Vite 7** build tool with React 19 + TypeScript 5.9
- **lucide-react 0.575** for all icons β€” no emojis used anywhere in the UI
- **Recharts 3** for all 2D charts (BarChart, AreaChart, LineChart, ScatterChart, RadarChart, PieChart)
- **TailwindCSS 4** for styling
- Tabs: Simulation | Predict | Metrics | Analytics | Recommendations | Research Paper
- API proxy in dev mode (`/api` β†’ `localhost:7860`) β†’ same-origin in production (served by FastAPI)
- **Analytics (GraphPanel):** 4-section dashboard β€” Fleet Overview (health kpi, fleet SOH bar, bubble scatter), Single Battery (SOH + RUL projection, capacity fade, degradation rate), Compare (multi-battery overlay), Temperature Analysis
- **Metrics (MetricsPanel):** 6-section interactive dashboard β€” Overview KPIs, Models (sort/filter/chart-type controls), Validation, Deep Learning, Dataset stats, Figures searchable gallery
- **Recommendations (RecommendationPanel):** Slider inputs for SOH/temp, 3 chart tabs (RUL bar, params bar, top-3 radar), expandable table rows with per-recommendation explanation