//! Phase-0 benchmark: residual + Jacobian assembly pass over the full system.
//!
//! Measures the cost of evaluating all component residuals and analytical
//! Jacobian entries once — the per-Newton-iteration work that dominates solver
//! runtime for real cycles.

use criterion::{black_box, criterion_group, criterion_main, Criterion};
use entropyk_components::JacobianBuilder;
use entropyk_components::ResidualVector;

mod common;

fn bench_residual_assembly(c: &mut Criterion) {
    let (system, state) = common::build_mock_system();
    let mut residuals = ResidualVector::with_capacity(system.full_state_vector_len());

    c.bench_function("residual_assembly_mock", |b| {
        b.iter(|| {
            residuals.clear();
            residuals.resize(system.full_state_vector_len(), 0.0);
            let _: () = system.compute_residuals(&state, &mut residuals).unwrap();
            black_box(());
        });
    });
}

fn bench_jacobian_assembly(c: &mut Criterion) {
    let (system, state) = common::build_mock_system();

    c.bench_function("jacobian_assembly_mock", |b| {
        b.iter(|| {
            let mut builder = JacobianBuilder::new();
            let _: () = system.assemble_jacobian(&state, &mut builder).unwrap();
            black_box(());
        });
    });
}

criterion_group!(benches, bench_residual_assembly, bench_jacobian_assembly);
criterion_main!(benches);
