đ Chiller Parameters
đ Diagnosis Result
Enter parameters and click "Diagnose System"
RF (Feature Selection) â NN (Representation) â SVM (Classification)
from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse import numpy as np import torch import torch.nn as nn from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler import warnings import pickle import os warnings.filterwarnings('ignore') app = FastAPI(title="Chiller Fault Detection System") # Define the Neural Network architecture class FeatureExtractor(nn.Module): def __init__(self, input_dim, hidden_dim=64, latent_dim=32): super(FeatureExtractor, self).__init__() self.encoder = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.2), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.2), nn.Linear(hidden_dim, latent_dim), nn.ReLU() ) def forward(self, x): return self.encoder(x) # Hybrid model class class HybridFDDModel: def __init__(self): self.rf_model = None self.nn_model = None self.svm_model = None self.scaler = StandardScaler() self.feature_importance = None self.is_trained = False self.top_features_idx = None def train_demo(self): """Train demonstration model with synthetic data""" print("Starting model training...") np.random.seed(42) features = [] labels_multiclass = [] fault_types = [ "Normal", "Reduced Evaporator Water Flow", "Reduced Condenser Water Flow", "Refrigerant Leakage", "Refrigerant Overcharge", "Excess Oil in Compressor", "Non-condensables in Refrigerant", "Compressor Valve Leakage", "Condenser Fouling" ] samples_per_class = 300 for class_idx, fault_name in enumerate(fault_types): print(f"Generating samples for: {fault_name}") for _ in range(samples_per_class): if fault_name == "Normal": params = [ np.random.normal(7.0, 0.5), np.random.normal(12.0, 0.5), np.random.normal(29.0, 1.0), np.random.normal(35.0, 1.0), np.random.normal(350, 20), np.random.normal(800, 30), np.random.normal(150, 15), np.random.normal(5.0, 0.3), np.random.normal(45, 5), np.random.normal(5, 1), np.random.normal(4, 1), np.random.normal(2, 0.5), np.random.normal(3, 0.5), np.random.normal(500, 30), np.random.normal(4.5, 0.3) ] elif fault_name == "Reduced Evaporator Water Flow": params = [ np.random.normal(9.0, 0.7), np.random.normal(13.5, 0.7), np.random.normal(29.5, 1.0), np.random.normal(35.5, 1.0), np.random.normal(340, 25), np.random.normal(810, 35), np.random.normal(150, 18), np.random.normal(5.0, 0.4), np.random.normal(45, 5), np.random.normal(6, 1.2), np.random.normal(3.5, 0.8), np.random.normal(4.5, 0.8), np.random.normal(3.2, 0.6), np.random.normal(420, 40), np.random.normal(3.2, 0.4) ] elif fault_name == "Reduced Condenser Water Flow": params = [ np.random.normal(7.2, 0.6), np.random.normal(12.2, 0.6), np.random.normal(32.0, 1.2), np.random.normal(39.0, 1.2), np.random.normal(345, 22), np.random.normal(950, 50), np.random.normal(155, 16), np.random.normal(5.1, 0.3), np.random.normal(46, 5), np.random.normal(5.5, 1.0), np.random.normal(4.0, 0.9), np.random.normal(2.2, 0.5), np.random.normal(5.5, 0.8), np.random.normal(490, 35), np.random.normal(3.5, 0.4) ] elif fault_name == "Refrigerant Leakage": params = [ np.random.normal(8.8, 0.7), np.random.normal(13.2, 0.7), np.random.normal(30.5, 1.0), np.random.normal(36.8, 1.0), np.random.normal(250, 30), np.random.normal(650, 40), np.random.normal(152, 18), np.random.normal(3.5, 0.4), np.random.normal(47, 6), np.random.normal(9, 1.5), np.random.normal(1.5, 0.8), np.random.normal(3.5, 0.7), np.random.normal(4.0, 0.7), np.random.normal(380, 35), np.random.normal(3.0, 0.5) ] elif fault_name == "Refrigerant Overcharge": params = [ np.random.normal(7.0, 0.6), np.random.normal(12.0, 0.6), np.random.normal(29.0, 1.0), np.random.normal(35.0, 1.0), np.random.normal(420, 25), np.random.normal(1000, 45), np.random.normal(180, 15), np.random.normal(6.5, 0.4), np.random.normal(44, 5), np.random.normal(4.5, 0.9), np.random.normal(7, 1), np.random.normal(2.5, 0.5), np.random.normal(3.5, 0.6), np.random.normal(510, 30), np.random.normal(3.8, 0.3) ] elif fault_name == "Excess Oil in Compressor": params = [ np.random.normal(7.5, 0.6), np.random.normal(12.5, 0.6), np.random.normal(29.5, 1.0), np.random.normal(35.5, 1.0), np.random.normal(330, 25), np.random.normal(820, 35), np.random.normal(165, 12), np.random.normal(5.0, 0.3), np.random.normal(55, 6), np.random.normal(5.5, 1.1), np.random.normal(3.8, 0.9), np.random.normal(2.8, 0.6), np.random.normal(3.3, 0.6), np.random.normal(475, 35), np.random.normal(3.6, 0.4) ] elif fault_name == "Non-condensables in Refrigerant": params = [ np.random.normal(7.3, 0.6), np.random.normal(12.3, 0.6), np.random.normal(30.0, 1.0), np.random.normal(36.0, 1.0), np.random.normal(340, 25), np.random.normal(1100, 60), np.random.normal(175, 18), np.random.normal(5.1, 0.4), np.random.normal(46, 5), np.random.normal(6.0, 1.2), np.random.normal(3.0, 0.8), np.random.normal(2.3, 0.5), np.random.normal(6, 1), np.random.normal(460, 40), np.random.normal(2.8, 0.5) ] elif fault_name == "Compressor Valve Leakage": params = [ np.random.normal(8.0, 0.7), np.random.normal(13.0, 0.7), np.random.normal(30.0, 1.0), np.random.normal(36.0, 1.0), np.random.normal(310, 25), np.random.normal(750, 50), np.random.normal(130, 15), np.random.normal(4.8, 0.4), np.random.normal(48, 6), np.random.normal(7, 1.2), np.random.normal(3.2, 0.9), np.random.normal(3.0, 0.6), np.random.normal(3.5, 0.6), np.random.normal(400, 35), np.random.normal(3.4, 0.4) ] else: # Condenser Fouling params = [ np.random.normal(7.5, 0.6), np.random.normal(12.5, 0.6), np.random.normal(31.0, 1.0), np.random.normal(37.0, 1.2), np.random.normal(345, 22), np.random.normal(900, 55), np.random.normal(160, 15), np.random.normal(5.0, 0.3), np.random.normal(45, 5), np.random.normal(5.2, 1.0), np.random.normal(3.8, 0.9), np.random.normal(2.2, 0.5), np.random.normal(5, 1.2), np.random.normal(485, 35), np.random.normal(3.3, 0.4) ] features.append(params) labels_multiclass.append(class_idx) X = np.array(features) y = np.array(labels_multiclass) print("Normalizing features...") X_scaled = self.scaler.fit_transform(X) print("Training Random Forest...") self.rf_model = RandomForestClassifier(n_estimators=100, random_state=42) self.rf_model.fit(X_scaled, y) self.feature_importance = self.rf_model.feature_importances_ self.top_features_idx = np.argsort(self.feature_importance)[-10:] X_selected = X_scaled[:, self.top_features_idx] print("Initializing Neural Network...") self.nn_model = FeatureExtractor(input_dim=10, hidden_dim=32, latent_dim=8) self.nn_model.eval() print("Extracting NN features...") with torch.no_grad(): X_tensor = torch.FloatTensor(X_selected) X_nn_features = self.nn_model(X_tensor).numpy() print("Training SVM...") self.svm_model = SVC(kernel='rbf', C=10, gamma='scale', probability=True, random_state=42) self.svm_model.fit(X_nn_features, y) self.is_trained = True print("Training complete!") return fault_types # Initialize model print("Loading or training model...") model = HybridFDDModel() fault_types = model.train_demo() # HTML Interface (same as before) HTML_PAGE = """