use deep_causality_haft::{Applicative, CoMonad, Functor, Monad};
use deep_causality_tensor::CausalTensor;
use deep_causality_tensor::CausalTensorWitness;
fn main() {
print_header();
let kappa = 8.0 * std::f64::consts::PI;
let lambda = 1e-5;
println!("Constants:");
println!(" Kappa (κ) : {:.4}", kappa);
println!(" Lambda (Λ) : {:.4}", lambda);
println!("--------------------------------------------------");
let metric_data = vec![
-1.0, 0.01, 0.0, 0.0, 0.01, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, ];
let metric_shape = vec![4, 4];
let g_uv =
CausalTensor::new(metric_data, metric_shape).expect("Failed to create metric tensor");
print_tensor("Metric Tensor (g_uv)", &g_uv);
let ricci_data = vec![
0.1, 0.005, 0.0, 0.0, 0.005, 0.05, 0.0, 0.0, 0.0, 0.0, 0.05, 0.0, 0.0, 0.0, 0.0, 0.05, ];
let ricci_shape = vec![4, 4];
let r_uv = CausalTensor::new(ricci_data, ricci_shape).expect("Failed to create Ricci tensor");
print_tensor("Ricci Tensor (R_uv)", &r_uv);
let scalar_curvature_val = 0.05;
println!("Calculating Einstein Tensor G_uv...");
println!("Formula: G_uv = R_uv + (-0.5 * R * g_uv)");
let scaling_factor = -0.5 * scalar_curvature_val;
let term_2 = <CausalTensorWitness as Functor<CausalTensorWitness>>::fmap(g_uv.clone(), |x| {
x * scaling_factor
});
let add_func_tensor =
<CausalTensorWitness as Functor<CausalTensorWitness>>::fmap(r_uv.clone(), |a: f64| {
Box::new(move |b: f64| a + b) as Box<dyn Fn(f64) -> f64>
});
let g_tensor =
<CausalTensorWitness as Applicative<CausalTensorWitness>>::apply(add_func_tensor, term_2);
print_tensor("Einstein Tensor (G_uv)", &g_tensor);
let lambda_term =
<CausalTensorWitness as Functor<CausalTensorWitness>>::fmap(g_uv.clone(), |x| x * lambda);
let lhs = &g_tensor + &lambda_term;
print_tensor("LHS (G_uv + Λ * g_uv)", &lhs);
let t_uv = <CausalTensorWitness as Functor<CausalTensorWitness>>::fmap(lhs, |x| x / kappa);
print_tensor("Stress-Energy Tensor (T_uv) Result", &t_uv);
println!("--------------------------------------------------");
println!("7. Advanced HKT: CoMonad for Local Field Analysis");
let anomaly_map = <CausalTensorWitness as CoMonad<CausalTensorWitness>>::extend(
&t_uv,
|view: &CausalTensor<f64>| {
let data = view.data();
let center = data[0];
let neighbor = if data.len() > 1 { data[1] } else { center };
(center - neighbor).abs()
},
);
print_tensor("Anomaly Map (Local Gradients)", &anomaly_map);
println!("--------------------------------------------------");
println!("8. Advanced HKT: Monad for Quantum Fluctuations");
println!(" Monad `bind` allows us to replace each value with a new structure (sub-tensor)");
println!(" and flatten the result. We use this to simulate splitting energy levels.");
let fluctuation_fn = |energy: f64| {
let delta = energy * 0.1; CausalTensor::new(vec![energy - delta, energy, energy + delta], vec![3]).unwrap()
};
let quantum_foam =
<CausalTensorWitness as Monad<CausalTensorWitness>>::bind(t_uv.clone(), fluctuation_fn);
println!("Original Elements: {}", t_uv.len());
println!("Quantum Foam Elements: {}", quantum_foam.len());
println!("First few fluctuations:");
let foam_data = quantum_foam.data();
for val in foam_data.iter().take(6) {
print!("{:.4} ", val);
}
println!("...");
}
pub(crate) fn print_header() {
println!("============================================================");
println!(" Einstein Field Equations with CausalTensor HKT");
println!("============================================================");
println!("Demonstrating Functor, Applicative, Monad, and CoMonad.");
println!("============================================================");
println!();
}
pub(crate) fn print_tensor(name: &str, tensor: &CausalTensor<f64>) {
println!("{}:", name);
let shape = tensor.shape();
if shape.len() != 2 {
println!("{:?}", tensor);
return;
}
let rows = shape[0];
let cols = shape[1];
let data = tensor.data();
println!("[");
for i in 0..rows {
print!(" [");
for j in 0..cols {
let val = data[i * cols + j];
if val.abs() < 1e-10 {
print!("{:>10.4}", 0.0);
} else {
print!("{:>10.4}", val);
}
if j < cols - 1 {
print!(", ");
}
}
println!(" ],");
}
println!("]");
println!();
}