polymer-aging-with-ml / frontend /src /components /PerformanceTracking.tsx
devjas1
Initial Release: Polymer Aging With ML [Standalone Appliance]
4a0e21d
Raw
History Blame Contribute Delete
5.4 kB
import React, { useEffect, useState } from "react";
import { apiClient, SystemInfo } from "../apiClient";
import "../static/style.css"; // Ensure the main CSS file is imported
const PerformanceTracking: React.FC = () => {
const [systemInfo, setSystemInfo] = useState<SystemInfo | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const fetchSystemInfo = async () => {
try {
setLoading(true);
setError(null);
const info = await apiClient.getSystemInfo();
setSystemInfo(info);
} catch (err) {
setError(
err instanceof Error ? err.message : "Failed to load system info"
);
} finally {
setLoading(false);
}
};
fetchSystemInfo();
}, []);
if (loading) {
return (
<div className="card">
<div className="loading-indicator">
<div className="spinner"></div>
<span>Loading Performance Data...</span>
</div>
</div>
);
}
if (error) {
return <div className="error-message">{error}</div>;
}
if (!systemInfo) {
return (
<div className="placeholder">
<p>No system information could be loaded.</p>
</div>
);
}
return (
<div className="performance-panel">
{/* --- System Health Card --- */}
<div className="card">
<h2 className="card__title">System Health</h2>
<div className="info-grid">
<div className="info-item">
<label>API Version</label>
<span>{systemInfo.version}</span>
</div>
<div className="info-item">
<label>Models Loaded</label>
<span>
{systemInfo.system_health.models_loaded} /{" "}
{systemInfo.system_health.total_models}
</span>
</div>
<div className="info-item">
<label>Memory Usage</label>
<span>
{systemInfo.system_health.memory_usage_mb.toFixed(1)} MB
</span>
</div>
<div className="info-item">
<label>PyTorch Version</label>
<span>{systemInfo.system_health.torch_version}</span>
</div>
<div className="info-item">
<label>CUDA Available</label>
<span
className={
systemInfo.system_health.cuda_available
? "status-ok"
: "status-bad"
}
>
{systemInfo.system_health.cuda_available ? "Yes" : "No"}
</span>
</div>
<div className="info-item">
<label>Max Batch Size</label>
<span>{systemInfo.max_batch_size}</span>
</div>
</div>
</div>
{/* --- Model Performance Card --- */}
<div className="card">
<h2 className="card__title">Available Models</h2>
<div className="model-grid">
{(systemInfo.available_models || []).map((model) => (
<div key={model.name} className="model-card">
<h4 className="model-card__title">
{model.display_name || model.name}
</h4>
<div className="model-card__metrics">
<div>
<span>Accuracy</span>
<span>
{((model.performance?.accuracy ?? 0) * 100).toFixed(1)}%
</span>
</div>
<div>
<span>F1 Score</span>
<span>
{((model.performance?.f1_score ?? 0) * 100).toFixed(1)}%
</span>
</div>
<div>
<span>Params</span>
<span>{model.parameters || "N/A"}</span>
</div>
<div>
<span>Status</span>
<span
className={model.available ? "status-ok" : "status-bad"}
>
{model.available ? "Available" : "Unavailable"}
</span>
</div>
</div>
<div className="model-info__callout">
<p>{model.description}</p>
</div>
</div>
))}
</div>
</div>
{/* --- Supported Features Card --- */}
<div className="card">
<h2 className="card__title">Supported Features</h2>
<div className="info-grid">
<div className="info-item">
<label>Modalities</label>
<span>{systemInfo.supported_modalities?.join(", ") ?? "N/A"}</span>
</div>
<div className="info-item">
<label>Target Length</label>
<span>{systemInfo.target_spectrum_length} points</span>
</div>
<div className="info-item">
<label>File Formats</label>
<span>.txt, .csv, .json</span>
</div>
<div className="info-item">
<label>Analysis Types</label>
<span>Single, Batch, Comparison</span>
</div>
</div>
</div>
</div>
);
};
export default PerformanceTracking;