Metrics Collection - Entrenar - Training & Optimization Library
Description: A comprehensive guide to building neural network training systems with autograd, optimizers, LoRA/QLoRA, and quantization using EXTREME TDD methodology

# Metrics Collection

The `MetricsCollector` uses Welford's algorithm for numerically stable running statistics.

## Basic Usage

    #![allow(unused)]
    fn main() {
    use entrenar::monitor::{MetricsCollector, Metric};

    let mut collector = MetricsCollector::new();

    // Record individual metrics
    collector.record(Metric::Loss, 0.5);
    collector.record(Metric::Accuracy, 0.85);

    // Record batch of metrics
    collector.record_batch(&[
        (Metric::Loss, 0.45),
        (Metric::Accuracy, 0.87),
        (Metric::GradientNorm, 1.2),
    ]);
    }

## Available Metrics

Metric | Purpose
--- | ---
`Metric::Loss` | Training loss
`Metric::Accuracy` | Model accuracy
`Metric::LearningRate` | Current LR
`Metric::GradientNorm` | Gradient L2 norm
`Metric::Epoch` | Current epoch
`Metric::Batch` | Current batch
`Metric::Custom(String)` | User-defined

## Getting Statistics

    #![allow(unused)]
    fn main() {
    let summary = collector.summary();

    if let Some(loss_stats) = summary.get(&Metric::Loss) {
        println!("Loss - mean: {:.4}, std: {:.4}", loss_stats.mean, loss_stats.std);
        println!("       min: {:.4}, max: {:.4}", loss_stats.min, loss_stats.max);

        if loss_stats.has_nan {
            println!("WARNING: NaN values detected!");
        }
    }
    }

## Welford's Algorithm

The collector uses Welford's online algorithm for O(1) updates:

    mean_new = mean_old + (x - mean_old) / n
    M2_new = M2_old + (x - mean_old) * (x - mean_new)
    variance = M2 / (n - 1)

This provides:

- Numerical stability for large datasets
- Constant memory usage
- O(1) per update