use greeners::{ThreeSLS, Equation};
use ndarray::{Array1, Array2};
use ndarray_rand::rand_distr::Normal;
use rand::thread_rng;
use rand::distributions::Distribution;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let n = 1000;
let income = Array1::from_iter((0..n).map(|_| 10.0 + Normal::new(0.0, 2.0).unwrap().sample(&mut thread_rng())));
let cost = Array1::from_iter((0..n).map(|_| 5.0 + Normal::new(0.0, 1.0).unwrap().sample(&mut thread_rng())));
let mut rng = thread_rng();
let dist_u = Normal::new(0.0, 1.0).unwrap();
let common_shock: Array1<f64> = Array1::from_iter((0..n).map(|_| dist_u.sample(&mut rng)));
let u = Array1::from_iter((0..n).map(|_| dist_u.sample(&mut rng))) + &common_shock * 0.5;
let v = Array1::from_iter((0..n).map(|_| dist_u.sample(&mut rng))) + &common_shock * 0.5;
let p = (&income * 0.1666) + (&cost * 0.3333) + 30.0 + (&u - &v) / 3.0;
let q_demanda = 100.0 - (&p * 2.0) + (&income * 0.5) + &u;
let mut x1_vec = Vec::new();
for i in 0..n {
x1_vec.push(1.0);
x1_vec.push(p[i]);
x1_vec.push(income[i]);
}
let x1 = Array2::from_shape_vec((n, 3), x1_vec)?;
let eq1 = Equation {
name: "Demand Curve".to_string(),
y: q_demanda.clone(),
x: x1,
};
let mut x2_vec = Vec::new();
for i in 0..n {
x2_vec.push(1.0);
x2_vec.push(p[i]);
x2_vec.push(cost[i]);
}
let x2 = Array2::from_shape_vec((n, 3), x2_vec)?;
let eq2 = Equation {
name: "Supply Curve".to_string(),
y: q_demanda.clone(), x: x2,
};
let mut z_vec = Vec::new();
for i in 0..n {
z_vec.push(1.0);
z_vec.push(income[i]);
z_vec.push(cost[i]);
}
let z = Array2::from_shape_vec((n, 3), z_vec)?;
println!("--- Simulando Sistema de Oferta e Demanda ---");
println!("Coeficientes Reais Demanda: Intercept=100, P=-2.0, Income=0.5");
println!("Coeficientes Reais Oferta: Intercept=10, P=1.0, Cost=-1.0\n");
let result = ThreeSLS::fit(&[eq1, eq2], &z)?;
println!("{}", result);
Ok(())
}