use greeners::VAR;
use ndarray::{Array2};
use ndarray_rand::rand_distr::Normal;
use rand::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let t_obs = 200;
let mut rng = rand::thread_rng();
let norm = Normal::new(0.0, 1.0).unwrap();
let mut data = Array2::<f64>::zeros((t_obs, 2));
data[[0, 0]] = 0.0;
data[[0, 1]] = 0.0;
for t in 1..t_obs {
let u1 = norm.sample(&mut rng);
let u2 = norm.sample(&mut rng) + 0.5 * u1;
let y1_prev = data[[t-1, 0]];
let y2_prev = data[[t-1, 1]];
data[[t, 0]] = 0.7 * y1_prev + 0.2 * y2_prev + u1;
data[[t, 1]] = 0.4 * y1_prev + 0.5 * y2_prev + u2;
}
println!("--- Vector Autoregression (VAR) Simulation ---");
println!("System: GDP (Var0) and Investment (Var1)");
println!("True Structure: Feedback loop (GDP <-> Inv)\n");
let var = VAR::fit(&data, 1, Some(vec!["GDP".into(), "Inv".into()]))?;
println!("{}", var);
println!("Estimated Matrix A1:");
println!("GDP eq: {:.4} * GDP(-1) + {:.4} * Inv(-1)", var.params[[1, 0]], var.params[[2, 0]]);
println!("Inv eq: {:.4} * GDP(-1) + {:.4} * Inv(-1)", var.params[[1, 1]], var.params[[2, 1]]);
println!("\nEsperado:");
println!("GDP eq: 0.7000 * GDP(-1) + 0.2000 * Inv(-1)");
println!("Inv eq: 0.4000 * GDP(-1) + 0.5000 * Inv(-1)");
println!("\n--- Impulse Response Analysis (Orthogonalized) ---");
println!("Choque no GDP (Var0) -> Efeito no Investment (Var1)");
let steps = 6;
let irf = var.irf(steps)?;
println!("{:<5} | {:<15}", "Time", "Response of Inv");
println!("{:-^25}", "-");
for h in 0..steps {
let response = irf[[h, 1, 0]];
println!("{:<5} | {:>10.4}", h, response);
}
println!("(Note: Effect should persist and decay over time)");
Ok(())
}