use deep_causality_sparse::CsrMatrix;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Demonstrating basic CsrMatrix operations:");
println!("\n--- Matrix A (2x3) from triplets ---");
let triplets_a = vec![(0, 0, 1.0), (0, 2, 2.0), (1, 1, 3.0)];
let a = CsrMatrix::from_triplets(2, 3, &triplets_a)?;
println!("Matrix A:\n{}", a); println!("A[0,0]: {}", a.get_value_at(0, 0));
println!("A[0,1]: {}", a.get_value_at(0, 1));
println!("\n--- Scalar Multiplication (A * 2.0) ---");
let scalar = 2.0;
let b = a.scalar_mult(scalar);
println!("Matrix B (A *{});\n{}", scalar, b);
println!("\n--- Matrix Addition (A + C) ---");
let triplets_c = vec![(0, 1, 5.0), (1, 0, 6.0)];
let c = CsrMatrix::from_triplets(2, 3, &triplets_c)?;
println!("Matrix C:\n{}", c);
let d = a.add_matrix(&c)?;
println!("Matrix D (A + C):\n{}", d);
println!("\n--- Matrix-Vector Multiplication (A * x) ---");
let x = vec![1.0, 2.0, 3.0];
let y = a.vec_mult(&x)?;
println!("Vector x: {:?}", x);
println!("Result y = Ax: {:?}", y);
println!("\n--- Matrix Multiplication (A * E) ---");
let triplets_e = vec![(0, 0, 4.0), (1, 1, 5.0), (2, 0, 6.0)];
let e = CsrMatrix::from_triplets(3, 2, &triplets_e)?;
println!("Matrix E:\n{}", e);
let f = a.mat_mult(&e)?;
println!("Matrix F (A * E):\n{}", f);
println!("\n--- Transpose (A^T) ---");
let a_t = a.transpose();
println!("Matrix A^T:\n{}", a_t);
println!("\n--- Error Handling (Dimension Mismatch) ---");
let x_invalid = vec![1.0, 2.0]; match a.vec_mult(&x_invalid) {
Ok(_) => println!("Unexpected success with invalid vector length"),
Err(e) => println!("Caught expected error: {}", e),
}
Ok(())
}