# hiral-kumar/cnc-digital-twin architecture

> Architecture diagram of the GitHub repository hiral-kumar/cnc-digital-twin, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hiral-kumar/cnc-digital-twin
- Repository: https://github.com/hiral-kumar/cnc-digital-twin

## Overview

PC-NDT is a bearing-health digital twin: dataset-specific loaders extract vibration features and RUL labels, preprocessing prepares temporal windows, and the training entry point fits a graph-and-continuous-time model with physics constraints. Evaluation covers held-out IMS, PRONOSTIA cross-condition generalization, LSTM/GRU comparisons, and Archard validation. The graph follows documented architecture and SOURCE INDEX references; unsampled entry-point bodies limit claims about some detailed calls.

Main entry points: [`src/models/pc_ndt.py`](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/pc_ndt.py) (PC-NDT model), [`src/data/preprocessing.py`](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/preprocessing.py) (Window preprocessing), [`scripts/train.py`](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/train.py) (Training workflow), [`scripts/baselines.py`](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/baselines.py) (Baseline comparison)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_data["Data preparation"]
  node_ims["IMS loader<br/>[ims_loader.py]"]
  node_pronostia["PRONOSTIA loader"]
  node_milling["Milling loader<br/>[milling_loader.py]"]
  node_prep["Window preprocessing<br/>[preprocessing.py]"]
  node_graphutils["Graph utilities<br/>[graph_utils.py]"]
end

subgraph group_core["Digital twin model"]
  node_agcrn["AGCRN encoder<br/>[agcrn.py]"]
  node_ode["Neural ODE<br/>[neural_ode.py]"]
  node_pcndt["PC-NDT model<br/>[pc_ndt.py]"]
end

subgraph group_learning["Training and physics"]
  node_constraints["Physics constraints<br/>[constraints.py]"]
  node_trainer["Trainer<br/>[trainer.py]"]
  node_train["Training workflow<br/>[train.py]"]
end

subgraph group_assessment["Evaluation workflows"]
  node_baseline_models["LSTM and GRU<br/>[lstm_gru.py]"]
  node_baseline_run["Baseline comparison<br/>[baselines.py]"]
  node_evaluate["IMS evaluation<br/>[evaluate.py]"]
  node_eval_pronostia["PRONOSTIA evaluation"]
  node_archard_validation["Archard validation"]
  node_metrics["Evaluation metrics<br/>[metrics.py]"]
end

node_engineer(("Engineer"))

node_engineer -->|"starts training"| node_train
node_engineer -->|"runs evaluation"| node_evaluate
node_engineer -->|"runs comparison"| node_baseline_run
node_engineer -->|"tests generalization"| node_eval_pronostia
node_engineer -->|"validates physics"| node_archard_validation
node_ims -->|"provides features"| node_prep
node_pronostia -->|"provides features"| node_prep
node_milling -.->|"supplies validation data"| node_archard_validation
node_train -->|"prepares windows"| node_prep
node_train -->|"trains model"| node_pcndt
node_train -->|"uses trainer"| node_trainer
node_train -->|"configures physics"| node_constraints
node_pcndt -->|"encodes sensors"| node_agcrn
node_pcndt -->|"propagates state"| node_ode
node_pcndt -->|"computes disagreement"| node_constraints
node_trainer -->|"computes physics loss"| node_constraints
node_constraints -->|"uses graph operations"| node_graphutils
node_evaluate -->|"prepares inputs"| node_prep
node_evaluate -->|"evaluates model"| node_pcndt
node_evaluate -->|"scores predictions"| node_metrics
node_eval_pronostia -->|"loads bearings"| node_pronostia
node_eval_pronostia -->|"prepares inputs"| node_prep
node_eval_pronostia -->|"evaluates model"| node_pcndt
node_eval_pronostia -->|"scores predictions"| node_metrics
node_baseline_run -->|"loads IMS data"| node_ims
node_baseline_run -->|"prepares inputs"| node_prep
node_baseline_run -->|"runs baselines"| node_baseline_models
node_baseline_run -->|"scores predictions"| node_metrics
node_archard_validation -->|"validates constraint"| node_constraints

click node_ims "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/ims_loader.py"
click node_pronostia "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/pronostia_loader.py"
click node_milling "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/milling_loader.py"
click node_prep "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/preprocessing.py"
click node_graphutils "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/graph_utils.py"
click node_agcrn "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/agcrn.py"
click node_ode "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/neural_ode.py"
click node_pcndt "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/pc_ndt.py"
click node_constraints "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/physics/constraints.py"
click node_trainer "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/training/trainer.py"
click node_train "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/train.py"
click node_baseline_models "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/baselines/lstm_gru.py"
click node_baseline_run "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/baselines.py"
click node_evaluate "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/evaluate.py"
click node_eval_pronostia "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/evaluate_pronostia.py"
click node_archard_validation "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/validate_archard.py"
click node_metrics "https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/evaluation/metrics.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ims,node_pronostia,node_milling,node_prep,node_graphutils toneBlue
class node_agcrn,node_ode,node_pcndt toneAmber
class node_constraints,node_trainer,node_train toneMint
class node_baseline_models,node_baseline_run,node_evaluate,node_eval_pronostia,node_archard_validation,node_metrics toneRose
class node_engineer toneIndigo
```

## Components

### Data preparation

- [IMS loader](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/ims_loader.py): `src/data/ims_loader.py`
- [PRONOSTIA loader](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/pronostia_loader.py): `src/data/pronostia_loader.py`
- [Milling loader](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/milling_loader.py): `src/data/milling_loader.py`
- [Window preprocessing](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/preprocessing.py): `src/data/preprocessing.py`
- [Graph utilities](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/data/graph_utils.py): `src/data/graph_utils.py`

### Digital twin model

- [AGCRN encoder](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/agcrn.py): `src/models/agcrn.py`
- [Neural ODE](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/neural_ode.py): `src/models/neural_ode.py`
- [PC-NDT model](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/models/pc_ndt.py): `src/models/pc_ndt.py`

### Training and physics

- [Physics constraints](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/physics/constraints.py): `src/physics/constraints.py`
- [Trainer](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/training/trainer.py): `src/training/trainer.py`
- [Training workflow](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/train.py): `scripts/train.py`

### Evaluation workflows

- [LSTM and GRU](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/baselines/lstm_gru.py): `src/baselines/lstm_gru.py`
- [Baseline comparison](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/baselines.py): `scripts/baselines.py`
- [IMS evaluation](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/evaluate.py): `scripts/evaluate.py`
- [PRONOSTIA evaluation](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/evaluate_pronostia.py): `scripts/evaluate_pronostia.py`
- [Archard validation](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/scripts/validate_archard.py): `scripts/validate_archard.py`
- [Evaluation metrics](https://github.com/hiral-kumar/cnc-digital-twin/blob/main/src/evaluation/metrics.py): `src/evaluation/metrics.py`

### Other components

- **Engineer**

## Connections

- Engineer → Training workflow: starts training (evidence: `README.md`)
- Engineer → IMS evaluation: runs evaluation (evidence: `README.md`)
- Engineer → Baseline comparison: runs comparison (evidence: `README.md`)
- Engineer → PRONOSTIA evaluation: tests generalization (evidence: `README.md`)
- Engineer → Archard validation: validates physics (evidence: `README.md`)
- IMS loader → Window preprocessing: provides features (evidence: `src/data/preprocessing.py`)
- PRONOSTIA loader → Window preprocessing: provides features (evidence: `src/data/preprocessing.py`)
- Milling loader → Archard validation: supplies validation data
- Training workflow → Window preprocessing: prepares windows (evidence: `scripts/train.py`)
- Training workflow → PC-NDT model: trains model (evidence: `scripts/train.py`)
- Training workflow → Trainer: uses trainer (evidence: `scripts/train.py`)
- Training workflow → Physics constraints: configures physics (evidence: `scripts/train.py`)
- PC-NDT model → AGCRN encoder: encodes sensors (evidence: `src/models/pc_ndt.py`)
- PC-NDT model → Neural ODE: propagates state (evidence: `src/models/pc_ndt.py`)
- PC-NDT model → Physics constraints: computes disagreement (evidence: `src/models/pc_ndt.py`)
- Trainer → Physics constraints: computes physics loss (evidence: `src/training/trainer.py`)
- Physics constraints → Graph utilities: uses graph operations (evidence: `src/physics/constraints.py`)
- IMS evaluation → Window preprocessing: prepares inputs (evidence: `scripts/evaluate.py`)
- IMS evaluation → PC-NDT model: evaluates model (evidence: `scripts/evaluate.py`)
- IMS evaluation → Evaluation metrics: scores predictions (evidence: `scripts/evaluate.py`)
- PRONOSTIA evaluation → PRONOSTIA loader: loads bearings (evidence: `scripts/evaluate_pronostia.py`)
- PRONOSTIA evaluation → Window preprocessing: prepares inputs (evidence: `scripts/evaluate_pronostia.py`)
- PRONOSTIA evaluation → PC-NDT model: evaluates model (evidence: `scripts/evaluate_pronostia.py`)
- PRONOSTIA evaluation → Evaluation metrics: scores predictions (evidence: `scripts/evaluate_pronostia.py`)
- Baseline comparison → IMS loader: loads IMS data (evidence: `scripts/baselines.py`)
- Baseline comparison → Window preprocessing: prepares inputs (evidence: `scripts/baselines.py`)
- Baseline comparison → LSTM and GRU: runs baselines (evidence: `scripts/baselines.py`)
- Baseline comparison → Evaluation metrics: scores predictions (evidence: `scripts/baselines.py`)
- Archard validation → Physics constraints: validates constraint (evidence: `scripts/validate_archard.py`)
