import React from 'react'; import { Paper, Box, Typography, LinearProgress, Grid, Alert } from '@mui/material'; import { Activity as ActivityIcon } from 'lucide-react'; import LossChart from './LossChart'; import { trainingMonitorStyles } from '../theme'; export default function TrainingMonitor({ trainingProgress, trainingStatus, trainingError, trainingConfig, indicatorState, }) { const getProgressColor = () => { if (trainingError) return 'error'; if (trainingProgress === 100) return 'success'; return 'primary'; }; const status = indicatorState?.status || 'idle'; const label = indicatorState?.label || 'Idle'; const animate = indicatorState?.animate || false; return ( Training Monitor {label} Progress {trainingProgress}% {trainingStatus?.device_info && ( { trainingStatus.device_info.type === 'cuda' ? 'CUDA' : trainingStatus.device_info.type === 'mps' ? 'MPS' : 'CPU' } {' · '}{trainingStatus.device_info.device} {trainingStatus.device_info.memory_gb ? ` · ${trainingStatus.device_info.memory_gb.toFixed(1)} GB` : ''} )} Current Epoch {trainingStatus?.current_epoch !== undefined ? `${trainingStatus.current_epoch + 1} / ${trainingConfig.epochs}` : '0 / ' + trainingConfig.epochs} Global Step / Total Steps {trainingStatus?.global_step !== undefined && trainingStatus?.total_steps !== undefined ? `${trainingStatus.global_step} / ${trainingStatus.total_steps}` : 'N/A'} Checkpoints Saved {trainingStatus?.checkpoints_saved || 0} Current Loss {trainingStatus?.loss ? parseFloat(trainingStatus.loss).toFixed(4) : 'N/A'} {trainingStatus?.loss_history && trainingStatus.loss_history.length > 0 && ( Loss History )} {trainingError && ( Training Error: {trainingError} )} ); }