File size: 10,697 Bytes
e9aea25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
02cadf7
 
 
 
 
 
 
 
 
 
 
e9aea25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
02cadf7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9aea25
 
 
02cadf7
e9aea25
 
 
02cadf7
e9aea25
 
 
02cadf7
e9aea25
 
 
02cadf7
e9aea25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
/**
 * Helper functions to extract and transform data science analysis results
 * for visualization in Analytics dashboard
 */

// Extract KPI metrics from analysis
export const extractKPIMetrics = (analysisResults) => {
  if (!analysisResults) return null;

  const crackData = analysisResults.crack_detection || {};
  const materialData = analysisResults.material_analysis || {};
  const envData = analysisResults.environmental_impact_assessment || {};
  const bioData = analysisResults.biological_growth || {};
  const insights = analysisResults.data_science_insights || {};
  const academicDS = analysisResults.academic_data_science || {};

  // Structural Health Score - from Unit 2: Descriptive Analytics
  const structuralHealth = insights.statistical_summary?.structural_health_score || 85;

  // Critical Issues Count - from crack detection
  const criticalIssues = crackData.count || 0;

  // AI Confidence - from Unit 3: Inferential Statistics (0-100 scale)
  let aiConfidence = 85; // Default confidence
  if (academicDS.unit3_inferential_statistics?.confidence_intervals) {
    const intervals = Object.values(academicDS.unit3_inferential_statistics.confidence_intervals);
    if (intervals.length > 0 && intervals[0]?.ci_95?.upper_bound) {
      aiConfidence = Math.min(100, intervals[0].ci_95.upper_bound);
    }
  } else if (materialData.probabilities) {
    const maxProb = Math.max(...Object.values(materialData.probabilities));
    aiConfidence = Math.round(maxProb * 100);
  }

  // Sustainability Score - from environmental assessment
  const sustainability = envData.sustainability_score || 7.5;

  return {
    structuralHealth,
    criticalIssues,
    aiConfidence,
    sustainability
  };
};

// Extract health trend data from Unit 5: Predictive Analytics
export const extractHealthTrendData = (analysisResults) => {
  if (!analysisResults) return [];

  const academicDS = analysisResults.academic_data_science || {};
  const predictive = academicDS.unit5_predictive_analytics || {};
  const timeSeriesData = predictive.time_series || {};
  const insights = analysisResults.data_science_insights || {};

  // Generate time series data based on current health + predictions
  const currentHealth = insights.statistical_summary?.structural_health_score || 85;
  
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  const currentMonth = new Date().getMonth();
  
  // Use time series forecasts if available
  const forecasts = timeSeriesData.forecasts?.next_3_periods || [];
  const trendSlope = timeSeriesData.trend_analysis?.slope || -0.5;
  
  return months.slice(0, currentMonth + 4).map((month, index) => {
    let healthValue, performanceValue, maintenanceValue;
    
    if (index <= currentMonth) {
      // Historical data (slightly varying from current)
      healthValue = Math.max(70, Math.min(100, currentHealth + (Math.random() - 0.5) * 5));
      performanceValue = healthValue - 5 + Math.random() * 3;
      maintenanceValue = healthValue + 2 + Math.random() * 3;
    } else {
      // Forecast data from predictive analytics
      const forecastIndex = index - currentMonth - 1;
      healthValue = forecasts[forecastIndex] || (currentHealth + trendSlope * (forecastIndex + 1));
      performanceValue = healthValue - 3;
      maintenanceValue = healthValue + 4;
    }
    
    return {
      month,
      'Structural Health': Math.round(healthValue * 10) / 10,
      'System Performance': Math.round(performanceValue * 10) / 10,
      'Maintenance Index': Math.round(maintenanceValue * 10) / 10
    };
  });
};

// Extract risk assessment data from Unit 4: ANOVA
export const extractRiskAssessmentData = (analysisResults) => {
  if (!analysisResults) return [];

  const academicDS = analysisResults.academic_data_science || {};
  const anovaResults = academicDS.unit4_anova || {};
  const crackData = analysisResults.crack_detection || {};
  const envData = analysisResults.environmental_impact_assessment || {};

  // Risk categories based on ANOVA analysis of severity groups
  // Calculate normalized scores (0-100 scale)
  
  // Structural Integrity: Higher critical crack ratio = lower score
  const totalCracks = Object.values(crackData.statistics?.severity_distribution || {}).reduce((a, b) => a + b, 1) || 1;
  const criticalRatio = (crackData.statistics?.severity_distribution?.Critical || 0) / totalCracks;
  const structuralScore = Math.max(30, 100 - (criticalRatio * 100));
  
  // Material Condition: Based on material confidence, not quantity
  const materialScore = (crackData.material_analysis?.material_confidence || 0.75) * 100;
  
  // Environmental Impact: Ensure sustainability score is 0-100
  const envScore = Math.min(100, Math.max(0, envData.sustainability_score || 75));
  
  // Maintenance Requirements: Fewer cracks = better score
  const maxCracksThreshold = 20;
  const crackRatio = Math.min(1, (crackData.count || 0) / maxCracksThreshold);
  const maintenanceScore = Math.max(30, 100 - (crackRatio * 70));
  
  return [
    { 
      category: 'Structural\nIntegrity', 
      score: Math.round(structuralScore * 10) / 10
    },
    { 
      category: 'Material\nCondition', 
      score: Math.round(materialScore * 10) / 10
    },
    { 
      category: 'Environmental\nImpact', 
      score: Math.round(envScore * 10) / 10
    },
    { 
      category: 'Maintenance\nRequirements', 
      score: Math.round(maintenanceScore * 10) / 10
    },
    { 
      category: 'System\nPerformance', 
      score: analysisResults.data_science_insights?.statistical_summary?.structural_health_score || 86 
    }
  ];
};

// Extract severity distribution from Unit 2: Frequency Distributions
export const extractSeverityDistribution = (analysisResults) => {
  if (!analysisResults) return [];

  const crackData = analysisResults.crack_detection || {};
  const academicDS = analysisResults.academic_data_science || {};
  const descriptive = academicDS.unit2_descriptive_analytics || {};
  
  // Get frequency distribution from descriptive analytics
  const freqDist = descriptive.frequency_distributions || {};
  const severityDist = crackData.statistics?.severity_distribution || {};

  const severityColors = {
    'Critical': '#dc2626',
    'Severe': '#ea580c',
    'Moderate': '#f59e0b',
    'Minor': '#10b981'
  };

  const severityPriority = {
    'Critical': 1,
    'Severe': 2,
    'Moderate': 3,
    'Minor': 4
  };

  const severityImpact = {
    'Critical': 'Immediate action required - structural failure risk',
    'Severe': 'Urgent repairs needed - accelerated deterioration',
    'Moderate': 'Monitor closely - schedule maintenance',
    'Minor': 'Routine monitoring - low immediate risk'
  };

  return Object.entries(severityDist).map(([type, value]) => ({
    type,
    value,
    color: severityColors[type] || '#6b7280',
    priority: severityPriority[type] || 5,
    impact: severityImpact[type] || 'Assessment required'
  }));
};

// Extract material confidence from Unit 2: Descriptive Statistics
export const extractMaterialConfidence = (analysisResults) => {
  if (!analysisResults) return [];

  const materialData = analysisResults.material_analysis || {};
  const academicDS = analysisResults.academic_data_science || {};
  const descriptive = academicDS.unit2_descriptive_analytics || {};

  const probabilities = materialData.probabilities || {};
  const materials = Object.entries(probabilities);

  const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9'];

  return materials.map(([material, prob], index) => {
    const confidence = prob * 100;
    return {
      material: material.charAt(0).toUpperCase() + material.slice(1),
      confidence: Math.round(confidence * 10) / 10,
      color: colors[index % colors.length],
      category: confidence >= 75 ? 'High Confidence' : confidence >= 50 ? 'Medium Confidence' : 'Low Confidence'
    };
  });
};

// Extract correlation data from Unit 2: Correlation Analysis
export const extractCorrelationData = (analysisResults) => {
  if (!analysisResults) return null;

  const academicDS = analysisResults.academic_data_science || {};
  const descriptive = academicDS.unit2_descriptive_analytics || {};
  const correlations = descriptive.correlation_analysis || {};

  return correlations.significant_correlations || [];
};

// Extract regression analysis from Unit 5: Linear Regression
export const extractRegressionData = (analysisResults) => {
  if (!analysisResults) return null;

  const academicDS = analysisResults.academic_data_science || {};
  const predictive = academicDS.unit5_predictive_analytics || {};
  const linearModels = predictive.linear_models || {};

  return {
    r_squared: linearModels.model_performance?.train_r_squared || 0,
    equation: linearModels.model_equation || '',
    rmse: linearModels.model_performance?.train_rmse || 0
  };
};

// Extract ANOVA results from Unit 4
export const extractANOVAResults = (analysisResults) => {
  if (!analysisResults) return null;

  const academicDS = analysisResults.academic_data_science || {};
  const anova = academicDS.unit4_anova || {};

  return {
    oneWayANOVA: anova.one_way_anova || {},
    chiSquare: anova.chi_square_tests || {}
  };
};

// Extract confidence intervals from Unit 3: Inferential Statistics
export const extractConfidenceIntervals = (analysisResults) => {
  if (!analysisResults) return null;

  const academicDS = analysisResults.academic_data_science || {};
  const inferential = academicDS.unit3_inferential_statistics || {};

  return inferential.confidence_intervals || {};
};

// Extract hypothesis testing results from Unit 3
export const extractHypothesisTests = (analysisResults) => {
  if (!analysisResults) return null;

  const academicDS = analysisResults.academic_data_science || {};
  const inferential = academicDS.unit3_inferential_statistics || {};

  return inferential.hypothesis_tests || {};
};

// Extract environmental impact metrics
export const extractEnvironmentalMetrics = (analysisResults) => {
  if (!analysisResults) return null;

  const envData = analysisResults.environmental_impact_assessment || {};

  return {
    carbonFootprint: envData.carbon_footprint_kg || 0,
    waterFootprint: envData.water_footprint_liters || 0,
    energyConsumption: envData.energy_consumption_kwh || 0,
    sustainabilityScore: envData.sustainability_score || 0,
    ecoEfficiency: envData.eco_efficiency_rating || 0,
    recommendations: envData.recommendations || []
  };
};

// Check if analysis data is available
export const hasAnalysisData = (analysisResults) => {
  return analysisResults && Object.keys(analysisResults).length > 0;
};