use crate::element::Tropical;
use crate::matrix::{MAX_DIM, TropMatrix};
pub fn kleene_star(a: &TropMatrix) -> TropMatrix {
let n = a.n;
let mut d = [Tropical::INF; MAX_DIM * MAX_DIM];
for i in 0..n {
for j in 0..n {
d[i * MAX_DIM + j] = a.get(i, j);
}
let idx = i * MAX_DIM + i;
d[idx] = d[idx].add(Tropical::ONE);
}
for k in 0..n {
for i in 0..n {
let d_ik = d[i * MAX_DIM + k];
if d_ik.is_inf() {
continue;
}
for j in 0..n {
let d_kj = d[k * MAX_DIM + j];
let candidate = d_ik.mul(d_kj);
let idx = i * MAX_DIM + j;
d[idx] = d[idx].add(candidate);
}
}
}
let mut result = TropMatrix::new(n);
result.data = d;
result
}