| 335 | |
| 336 | fn cluster_variance(cov: &DMatrix<f64>, indices: &[usize]) -> Result<f64, HcaaError> { |
| 337 | let w = inverse_variance_weights(cov, indices)?; |
| 338 | let mut v = 0.0; |
| 339 | for (ii, &i) in indices.iter().enumerate() { |
| 340 | for (jj, &j) in indices.iter().enumerate() { |
| 341 | v += w[ii] * cov[(i, j)] * w[jj]; |
| 342 | } |
| 343 | } |
| 344 | Ok(v.max(0.0)) |
| 345 | } |
| 346 | |
| 347 | fn cluster_sharpe( |
| 348 | expected: &[f64], |
| 349 | cov: &DMatrix<f64>, |
| 350 | indices: &[usize], |
| 351 | ) -> Result<f64, HcaaError> { |
| 352 | let w = inverse_variance_weights(cov, indices)?; |
| 353 | let mut mu = 0.0; |
| 354 | for (ii, &i) in indices.iter().enumerate() { |