use nereids_core::types::Isotope;
use nereids_endf::parser::parse_endf_file2;
use nereids_endf::retrieval::{EndfLibrary, EndfRetriever, mat_number};
use nereids_fitting::lm::{LmConfig, levenberg_marquardt};
use nereids_fitting::parameters::{FitParameter, ParameterSet};
use nereids_fitting::transmission_model::TransmissionFitModel;
use nereids_physics::transmission::{SampleParams, forward_model};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let isotope = Isotope::new(92, 238)?;
let retriever = EndfRetriever::new();
let mat = mat_number(&isotope, EndfLibrary::EndfB8_1).expect("U-238 has a known MAT number");
let (_path, endf_text) = retriever.get_endf_file(&isotope, EndfLibrary::EndfB8_1, mat)?;
let resonance_data = parse_endf_file2(&endf_text)?;
println!(
"U-238: {} resonances, AWR = {:.1}",
resonance_data.total_resonance_count(),
resonance_data.awr,
);
let energies: Vec<f64> = (0..2000)
.map(|i| 1.0 + (i as f64) * 29.0 / 2000.0)
.collect();
let sample = SampleParams::new(300.0, vec![(resonance_data.clone(), 0.001)])?;
let transmission = forward_model(&energies, &sample, None)?;
let measured_t = transmission.clone();
let sigma: Vec<f64> = vec![0.01; measured_t.len()];
let model = TransmissionFitModel::new(
energies.clone(),
vec![resonance_data],
300.0, None, (vec![0], vec![1.0]), None, None, )?;
let mut params = ParameterSet::new(vec![FitParameter::non_negative("U-238 density", 0.0005)]);
let config = LmConfig::default();
let result = levenberg_marquardt(&model, &measured_t, &sigma, &mut params, &config)?;
println!("Fitted density: {:.6} atoms/barn", result.params[0]);
println!("Reduced chi-squared: {:.3}", result.reduced_chi_squared);
println!("Converged: {}", result.converged);
Ok(())
}