pub fn generate_das_dennis(num_objectives: usize, p: usize) -> Vec<Vec<f64>> {
if num_objectives == 0 {
return Vec::new();
}
if num_objectives == 1 {
let v = if p == 0 { 0.0 } else { 1.0 };
return vec![vec![v]];
}
let mut result: Vec<Vec<f64>> = Vec::new();
let mut current: Vec<usize> = vec![0; num_objectives];
enumerate_partitions(p, num_objectives, 0, p, &mut current, &mut result);
result
}
fn enumerate_partitions(
total: usize,
m: usize,
dim: usize,
remaining: usize,
current: &mut Vec<usize>,
result: &mut Vec<Vec<f64>>,
) {
if dim == m - 1 {
current[dim] = remaining;
let denom = if total == 0 { 1.0 } else { total as f64 };
result.push(current.iter().map(|&n| n as f64 / denom).collect());
return;
}
for v in 0..=remaining {
current[dim] = v;
enumerate_partitions(total, m, dim + 1, remaining - v, current, result);
}
}