| 286 | } |
| 287 | |
| 288 | fn quasi_diagonalization( |
| 289 | num_assets: usize, |
| 290 | clusters: &[[usize; 2]], |
| 291 | curr_index: usize, |
| 292 | ) -> Vec<usize> { |
| 293 | if curr_index < num_assets { |
| 294 | return vec![curr_index]; |
| 295 | } |
| 296 | let row = curr_index - num_assets; |
| 297 | let left = clusters[row][0]; |
| 298 | let right = clusters[row][1]; |
| 299 | let mut out = quasi_diagonalization(num_assets, clusters, left); |
| 300 | out.extend(quasi_diagonalization(num_assets, clusters, right)); |
| 301 | out |
| 302 | } |
| 303 | |
| 304 | fn seriate_matrix(mat: &DMatrix<f64>, order: &[usize]) -> DMatrix<f64> { |
| 305 | let n = order.len(); |