use ndwt::Wavelet;
use ndwt::boundarys::BoundaryCondition;
use ndwt::lwt::driver::WaveletTransform;
fn main() {
let wvlt = Wavelet::Daubechies4;
let level = 3;
let rows = 64_usize;
let cols = 64_usize;
let shape = [rows, cols];
let axes = [0_usize, 1]; let bc = BoundaryCondition::Periodic;
let trans = WaveletTransform::new(wvlt, bc);
let n = rows * cols;
let x: Vec<f64> = (0..n).map(|i| ((i as f64) * 0.17).sin()).collect();
let mut coeffs = vec![0.0_f64; n];
trans.forward_multilevel_nd(&x, &mut coeffs, &shape, &axes, level);
println!("Input shape : {}×{}", rows, cols);
println!(
"Output shape : {}×{} (LWT is length-preserving)",
rows, cols
);
println!("First 8 coefficients: {:?}", &coeffs[..8]);
let mut x2 = vec![0.0_f64; n];
trans.inverse_multilevel_nd(&coeffs, &mut x2, &shape, &axes, level);
let max_err = x
.iter()
.zip(&x2)
.map(|(a, b)| (a - b).abs())
.fold(0.0_f64, f64::max);
println!("Max round-trip error: {:.2e}", max_err);
assert!(max_err < 1e-10, "round-trip error too large: {max_err}");
println!("Round-trip OK.");
}