use anyhow::Result;
use fixedbitset::FixedBitSet;
use log::info;
use ndarray::Array2;
use std::time::{Duration, Instant};
use super::band::{
BandIndex, BandKernelPerf, avg_band_time_us, band_to_row, calculate_ab_band,
calculate_atx_band, row_to_band,
};
use crate::splits::asplit::ASplit;
pub const DEFAULT_CUTOFF: f64 = 1e-6;
#[derive(Debug, Clone, serde::Serialize, Default)]
pub struct CGSolveStats {
pub outer_iterations: usize,
pub cg_calls: usize,
pub cg_iters_total: usize,
pub max_cg_iters_single_call: usize,
pub stagnation_exits: usize,
pub inner_loop_activations: usize,
pub collapse_events: usize,
pub collapsed_indices_total: usize,
pub kernel_ab_calls: usize,
pub kernel_atx_calls: usize,
pub elapsed_secs: f64,
}
type KernelPerf = BandKernelPerf;
#[derive(Debug)]
struct SolveProgress {
started: Instant,
next_log: Instant,
next_inner_log: Instant,
outer_iter: usize,
cg_calls: usize,
cg_iters_total: usize,
collapse_events: usize,
collapsed_indices_total: usize,
max_cg_iters_single_call: usize,
inner_loop_activations: usize,
stagnation_exits: usize,
}
impl SolveProgress {
fn new(now: Instant) -> Self {
Self {
started: now,
next_log: now + Duration::from_secs(5),
next_inner_log: now + Duration::from_secs(10),
outer_iter: 0,
cg_calls: 0,
cg_iters_total: 0,
collapse_events: 0,
collapsed_indices_total: 0,
max_cg_iters_single_call: 0,
inner_loop_activations: 0,
stagnation_exits: 0,
}
}
}
#[derive(Clone, Copy, Debug)]
struct CGOptions {
cutoff: f64,
}
impl Default for CGOptions {
fn default() -> Self {
Self {
cutoff: DEFAULT_CUTOFF,
}
}
}
pub fn compute_splits(
cycle: &[usize],
distances: &Array2<f64>,
) -> Result<(Vec<ASplit>, CGSolveStats)> {
compute_weighted_splits(cycle, distances, CGOptions::default())
}
fn compute_weighted_splits(
cycle: &[usize],
distances: &Array2<f64>,
options: CGOptions,
) -> Result<(Vec<ASplit>, CGSolveStats)> {
let n = cycle.len().saturating_sub(1);
if n <= 1 {
return Ok((Vec::new(), CGSolveStats::default()));
}
if n == 2 {
let d_ij = distances[[cycle[1] - 1, cycle[2] - 1]];
if d_ij > 0.0 {
let mut a = FixedBitSet::with_capacity(n + 1);
a.grow(n + 1);
a.set(cycle[1], true);
return Ok((
vec![ASplit::from_a_ntax_with_weight(a, n, d_ij)],
CGSolveStats::default(),
));
}
return Ok((Vec::new(), CGSolveStats::default()));
}
let npairs = n * (n - 1) / 2;
let d = setup_d(distances, cycle, n);
let w: Vec<f64> = Vec::new();
let mut x = vec![0.0; npairs];
let weights_opt = if w.is_empty() { None } else { Some(&w[..]) };
let stats = run_active_conjugate(n, &d, weights_opt, &mut x);
let mut splits = Vec::new();
let mut index = 0usize;
for i in 0..n {
let mut a = FixedBitSet::with_capacity(n + 1);
a.grow(n + 1);
for j in (i + 1)..n {
a.set(cycle[j + 1], true);
if x[index] > options.cutoff {
splits.push(ASplit::from_a_ntax_with_weight(a.clone(), n, x[index]));
}
index += 1;
}
}
Ok((splits, stats))
}
fn setup_d(distances: &Array2<f64>, cycle: &[usize], n: usize) -> Vec<f64> {
let mut d = vec![0.0; n * (n - 1) / 2];
let mut index = 0usize;
for i in 0..n {
for j in (i + 1)..n {
d[index] = distances[[cycle[i + 1] - 1, cycle[j + 1] - 1]];
index += 1;
}
}
d
}
fn run_active_conjugate(n: usize, d: &[f64], w: Option<&[f64]>, x: &mut [f64]) -> CGSolveStats {
let collapse_many_negs = true;
let npairs = d.len();
let band = BandIndex::new(n);
let track_kernel_perf = npairs > 4096;
let mut kernel_perf = KernelPerf::default();
let started = Instant::now();
let mut progress = SolveProgress::new(started);
debug_assert_eq!(
x.len(),
npairs,
"Vectors d,x have different dimensions: d.len()={}, x.len()={}",
npairs,
x.len()
);
run_unconstrained_ls(n, d, x);
if x.iter().all(|&val| val >= 0.0) {
return CGSolveStats {
elapsed_secs: started.elapsed().as_secs_f64(),
..Default::default()
};
}
let mut x_band = vec![0.0; npairs];
row_to_band(x, &mut x_band, &band);
let w_band = w.map(|weights| {
let mut wb = vec![0.0; npairs];
row_to_band(weights, &mut wb, &band);
wb
});
let mut buf = vec![0.0; npairs]; let mut row_sums = vec![0.0; n];
let mut shifted = vec![0.0; n];
let mut atwd = vec![0.0; npairs];
{
let mut y_band = vec![0.0; npairs];
match w {
Some(_weights) => {
let mut d_band = vec![0.0; npairs];
row_to_band(d, &mut d_band, &band);
let wb = w_band.as_ref().unwrap();
for k in 0..npairs {
y_band[k] = wb[k] * d_band[k];
}
}
None => row_to_band(d, &mut y_band, &band),
}
calculate_atx_band(&y_band, &mut atwd, &band, &mut row_sums, &mut shifted);
}
let mut r = vec![0.0; npairs];
let mut wtmp = vec![0.0; npairs];
let mut p = vec![0.0; npairs];
let mut old_x = vec![1.0; npairs];
let mut negative_values = Vec::new();
let mut selected_negative_indices = Vec::new();
let mut active = vec![false; npairs];
let fixed_active = vec![false; npairs];
let mut free_indices: Vec<usize> = (0..npairs).collect();
let mut first_pass = true;
loop {
progress.outer_iter += 1;
let tol_factor = 1e-8;
loop {
if !first_pass {
free_indices = (0..npairs).filter(|&i| !active[i]).collect();
circular_conjugate_grads_band_direct(
npairs,
&mut r,
&mut wtmp,
&mut p,
&atwd,
&active,
&mut x_band,
&band,
&mut buf,
&mut row_sums,
&mut shifted,
&mut progress,
&mut kernel_perf,
track_kernel_perf,
&free_indices,
tol_factor,
);
}
first_pass = false;
if collapse_many_negs {
if worst_indices_reuse(
&x_band,
0.6,
&mut negative_values,
&mut selected_negative_indices,
) {
progress.collapse_events += 1;
progress.collapsed_indices_total += selected_negative_indices.len();
for &idx in &selected_negative_indices {
x_band[idx] = 0.0;
active[idx] = true;
}
free_indices = (0..npairs).filter(|&i| !active[i]).collect();
circular_conjugate_grads_band_direct(
npairs,
&mut r,
&mut wtmp,
&mut p,
&atwd,
&active,
&mut x_band,
&band,
&mut buf,
&mut row_sums,
&mut shifted,
&mut progress,
&mut kernel_perf,
track_kernel_perf,
&free_indices,
tol_factor,
);
}
}
let mut min_i: Option<usize> = None;
let mut min_xi = -1.0_f64;
for &i in &free_indices {
if x_band[i] < 0.0 {
let xi = old_x[i] / (old_x[i] - x_band[i]);
if min_i.is_none() || xi < min_xi {
min_i = Some(i);
min_xi = xi;
}
}
}
if min_i.is_none() {
break;
} else {
for &i in &free_indices {
old_x[i] += min_xi * (x_band[i] - old_x[i]);
}
let min_i = min_i.unwrap();
active[min_i] = true;
x_band[min_i] = 0.0;
progress.inner_loop_activations += 1;
}
}
if track_kernel_perf {
let t0 = Instant::now();
calculate_ab_band(&x_band, &mut buf, &band, &mut row_sums, &mut shifted);
kernel_perf.calc_ab_calls += 1;
kernel_perf.calc_ab_time += t0.elapsed();
} else {
calculate_ab_band(&x_band, &mut buf, &band, &mut row_sums, &mut shifted);
}
if let Some(wb) = w_band.as_deref() {
for (b, w) in buf.iter_mut().zip(wb.iter()) {
*b *= *w;
}
}
if track_kernel_perf {
let t0 = Instant::now();
calculate_atx_band(&buf, &mut r, &band, &mut row_sums, &mut shifted);
kernel_perf.calc_atx_calls += 1;
kernel_perf.calc_atx_time += t0.elapsed();
} else {
calculate_atx_band(&buf, &mut r, &band, &mut row_sums, &mut shifted);
}
if track_kernel_perf && Instant::now() >= progress.next_log {
let active_count = active.iter().filter(|&&f| f).count();
info!(
"CG inference progress: outer_iter={} elapsed={:.1}s cg_calls={} cg_iters_total={} max_cg_single={} active={} inner_activations={} stagnation_exits={} collapse_events={} collapsed_total={} ab_calls={} atx_calls={} ab_avg_us={:.1} atx_avg_us={:.1}",
progress.outer_iter,
progress.started.elapsed().as_secs_f64(),
progress.cg_calls,
progress.cg_iters_total,
progress.max_cg_iters_single_call,
active_count,
progress.inner_loop_activations,
progress.stagnation_exits,
progress.collapse_events,
progress.collapsed_indices_total,
kernel_perf.calc_ab_calls,
kernel_perf.calc_atx_calls,
avg_time_us(kernel_perf.calc_ab_time, kernel_perf.calc_ab_calls),
avg_time_us(kernel_perf.calc_atx_time, kernel_perf.calc_atx_calls),
);
progress.next_log = Instant::now() + Duration::from_secs(5);
}
let mut min_i: Option<usize> = None;
let mut min_grad = 1.0_f64;
for i in 0..npairs {
r[i] -= atwd[i];
if active[i] && !fixed_active[i] {
let grad_ij = r[i];
if min_i.is_none() || grad_ij < min_grad {
min_i = Some(i);
min_grad = grad_ij;
}
}
}
if min_i.is_none() || min_grad > -0.0001 {
if track_kernel_perf {
info!(
"CG inference complete: outer_iters={} elapsed={:.1}s cg_calls={} cg_iters_total={} max_cg_single={} inner_activations={} stagnation_exits={} collapse_events={} collapsed_total={}",
progress.outer_iter,
progress.started.elapsed().as_secs_f64(),
progress.cg_calls,
progress.cg_iters_total,
progress.max_cg_iters_single_call,
progress.inner_loop_activations,
progress.stagnation_exits,
progress.collapse_events,
progress.collapsed_indices_total,
);
}
band_to_row(&x_band, x, &band);
return CGSolveStats {
outer_iterations: progress.outer_iter,
cg_calls: progress.cg_calls,
cg_iters_total: progress.cg_iters_total,
max_cg_iters_single_call: progress.max_cg_iters_single_call,
stagnation_exits: progress.stagnation_exits,
inner_loop_activations: progress.inner_loop_activations,
collapse_events: progress.collapse_events,
collapsed_indices_total: progress.collapsed_indices_total,
kernel_ab_calls: kernel_perf.calc_ab_calls,
kernel_atx_calls: kernel_perf.calc_atx_calls,
elapsed_secs: progress.started.elapsed().as_secs_f64(),
};
} else {
active[min_i.unwrap()] = false;
}
}
}
fn worst_indices_reuse(
x: &[f64],
prop_kept: f64,
negative_values: &mut Vec<f64>,
result: &mut Vec<usize>,
) -> bool {
if prop_kept == 0.0 {
return false;
}
negative_values.clear();
for &val in x {
if val < 0.0 {
negative_values.push(val);
}
}
let num_neg = negative_values.len();
if num_neg == 0 {
result.clear();
return false;
}
let nkept = ((prop_kept * num_neg as f64).ceil() as usize).max(1);
let cutoff = {
let kth = nkept - 1;
let (_, pivot, _) =
negative_values.select_nth_unstable_by(kth, |a, b| a.partial_cmp(b).unwrap());
*pivot
};
result.clear();
result.resize(nkept, 0usize);
let mut front = 0usize;
let mut back = nkept.saturating_sub(1);
for (i, &val) in x.iter().enumerate() {
if val < cutoff {
result[front] = i;
front += 1;
} else if val == cutoff {
if back >= front {
result[back] = i;
if back == 0 {
break;
}
back -= 1;
}
}
}
true
}
fn run_unconstrained_ls(n: usize, d: &[f64], x: &mut [f64]) {
let mut index = 0usize;
for i in 0..=n - 3 {
x[index] = (d[index] + d[index + (n - i - 2) + 1] - d[index + 1]) / 2.0;
index += 1;
for _j in (i + 2)..=n - 2 {
x[index] =
(d[index] + d[index + (n - i - 2) + 1] - d[index + 1] - d[index + (n - i - 2)])
/ 2.0;
index += 1;
}
if i == 0 {
x[index] = (d[0] + d[n - 2] - d[2 * n - 4]) / 2.0;
} else {
x[index] = (d[index] + d[i] - d[i - 1] - d[index + (n - i - 2)]) / 2.0;
}
index += 1;
}
x[index] = (d[index] + d[n - 2] - d[n - 3]) / 2.0;
}
fn avg_time_us(total: Duration, calls: usize) -> f64 {
avg_band_time_us(total, calls)
}
fn circular_conjugate_grads_band_direct(
npairs: usize,
r: &mut [f64],
w: &mut [f64],
p: &mut [f64],
b: &[f64],
active: &[bool],
x: &mut [f64],
band: &BandIndex,
buf: &mut [f64],
row_sums: &mut [f64],
shifted: &mut [f64],
progress: &mut SolveProgress,
kernel_perf: &mut KernelPerf,
track_kernel_perf: bool,
free_indices: &[usize],
tol_factor: f64,
) {
let kmax = (2 * free_indices.len()).min(band.npairs);
progress.cg_calls += 1;
let cg_call = progress.cg_calls;
if track_kernel_perf {
let t0 = Instant::now();
calculate_ab_band(x, buf, band, row_sums, shifted);
kernel_perf.calc_ab_calls += 1;
kernel_perf.calc_ab_time += t0.elapsed();
let t0 = Instant::now();
calculate_atx_band(buf, r, band, row_sums, shifted);
kernel_perf.calc_atx_calls += 1;
kernel_perf.calc_atx_time += t0.elapsed();
} else {
calculate_ab_band(x, buf, band, row_sums, shifted);
calculate_atx_band(buf, r, band, row_sums, shifted);
}
for k in 0..npairs {
if !active[k] {
r[k] = b[k] - r[k];
} else {
r[k] = 0.0;
}
}
let mut rho: f64 = r.iter().map(|v| v * v).sum();
let mut r_norm_sq: f64 = rho;
let mut rho_old = 0.0;
let b_norm_sq: f64 = b.iter().map(|v| v * v).sum();
let e0_sq = tol_factor * b_norm_sq;
let mut k = 0usize;
let mut checkpoint_norm = r_norm_sq;
while r_norm_sq > e0_sq && k < kmax {
k += 1;
if k == 1 {
p.copy_from_slice(r);
} else {
let beta = rho / rho_old;
for &i in free_indices {
p[i] = r[i] + beta * p[i];
}
}
if track_kernel_perf {
let t0 = Instant::now();
calculate_ab_band(p, buf, band, row_sums, shifted);
kernel_perf.calc_ab_calls += 1;
kernel_perf.calc_ab_time += t0.elapsed();
let t0 = Instant::now();
calculate_atx_band(buf, w, band, row_sums, shifted);
kernel_perf.calc_atx_calls += 1;
kernel_perf.calc_atx_time += t0.elapsed();
} else {
calculate_ab_band(p, buf, band, row_sums, shifted);
calculate_atx_band(buf, w, band, row_sums, shifted);
}
let mut alpha_den = 0.0;
for &i in free_indices {
alpha_den += p[i] * w[i];
}
let alpha = rho / alpha_den;
let mut rho_new = 0.0;
for &i in free_indices {
x[i] += alpha * p[i];
r[i] -= alpha * w[i];
rho_new += r[i] * r[i];
}
rho_old = rho;
rho = rho_new;
r_norm_sq = rho_new;
if k > 0 && k % 200 == 0 {
if r_norm_sq > 0.5 * checkpoint_norm {
if track_kernel_perf {
progress.stagnation_exits += 1;
}
break;
}
checkpoint_norm = r_norm_sq;
}
if track_kernel_perf && (k & 255) == 0 {
let now = Instant::now();
if now >= progress.next_inner_log {
info!(
"CG solver progress: outer_iter={} cg_call={} local_iter={}/{} global_cg_iters~{} elapsed={:.1}s r_norm_sq={:.6e} threshold={:.6e}",
progress.outer_iter,
cg_call,
k,
kmax,
progress.cg_iters_total + k,
progress.started.elapsed().as_secs_f64(),
r_norm_sq,
e0_sq
);
progress.next_inner_log = now + Duration::from_secs(10);
}
}
}
progress.cg_iters_total += k;
if k > progress.max_cg_iters_single_call {
progress.max_cg_iters_single_call = k;
}
}
#[cfg(test)]
mod tests {
use super::*;
use ndarray::arr2;
fn compare_float_array(actual: &[f64], expected: &[f64], eps: f64) {
assert_eq!(actual.len(), expected.len());
for (i, (a, e)) in actual.iter().zip(expected.iter()).enumerate() {
assert!(
(a - e).abs() <= eps,
"index {}: got {}, expected {}",
i,
a,
e
);
}
}
#[test]
fn splitstree4_colors_example() {
let d = arr2(&[
[
0.0, 61.0, 105.0, 121.0, 131.0, 124.0, 106.0, 85.0, 52.0, 31.0,
],
[
61.0, 0.0, 55.0, 99.0, 116.0, 124.0, 130.0, 125.0, 99.0, 80.0,
],
[
105.0, 55.0, 0.0, 54.0, 81.0, 101.0, 121.0, 131.0, 128.0, 118.0,
],
[
121.0, 99.0, 54.0, 0.0, 33.0, 55.0, 85.0, 106.0, 121.0, 124.0,
],
[
131.0, 116.0, 81.0, 33.0, 0.0, 35.0, 65.0, 93.0, 116.0, 121.0,
],
[
124.0, 124.0, 101.0, 55.0, 35.0, 0.0, 41.0, 73.0, 102.0, 115.0,
],
[106.0, 130.0, 121.0, 85.0, 65.0, 41.0, 0.0, 45.0, 84.0, 94.0],
[85.0, 125.0, 131.0, 106.0, 93.0, 73.0, 45.0, 0.0, 45.0, 62.0],
[
52.0, 99.0, 128.0, 121.0, 116.0, 102.0, 84.0, 45.0, 0.0, 30.0,
],
[
31.0, 80.0, 118.0, 124.0, 121.0, 115.0, 94.0, 62.0, 30.0, 0.0,
],
]);
let cycle: Vec<usize> = (0..=10).collect();
let (splits, _stats) = compute_splits(&cycle, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
5.503635951798027,
14.012163344705773,
3.5533335771328205,
7.469922771075659,
11.914973223026623,
8.172339326084673,
3.358374993195678,
1.0508886007827904,
6.033393151839444,
4.990767005203059,
5.013706887707536,
5.971073245949106,
6.988461196842988,
7.555721537455618,
11.434879693696914,
4.534821483351042,
2.9916936088110013,
3.0122771556209744,
0.9813219827151619,
5.001879614262478,
5.500083640891861,
9.006523763924847,
6.500617962590147,
4.9710732459492,
6.48419537830867,
0.013197742953723019,
3.5259667730167075,
4.112120076412572,
0.8906725577608088,
6.448937922234535,
5.540931519198572,
2.040290755233919,
3.0712252670111115,
3.3564055866886178,
6.301698006563124,
4.5315026447524795,
0.7912016394935651,
3.191819737660607,
3.0603654194876193,
5.412274691013096,
6.109805561476523,
4.34039787028925,
];
assert_eq!(weights.len(), expected.len());
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_5_1() {
let d = arr2(&[
[0.0, 5.0, 9.0, 9.0, 8.0],
[5.0, 0.0, 10.0, 10.0, 9.0],
[9.0, 10.0, 0.0, 8.0, 7.0],
[9.0, 10.0, 8.0, 0.0, 3.0],
[8.0, 9.0, 7.0, 3.0, 0.0],
]);
let ord = vec![0, 1, 2, 5, 4, 3];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![3.0, 2.0, 1.0, 2.0, 3.0, 2.0, 4.0];
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_10_1() {
let d = arr2(&[
[0.0, 5.0, 12.0, 7.0, 3.0, 9.0, 11.0, 6.0, 4.0, 10.0],
[5.0, 0.0, 8.0, 2.0, 14.0, 5.0, 13.0, 7.0, 12.0, 1.0],
[12.0, 8.0, 0.0, 4.0, 9.0, 3.0, 8.0, 2.0, 5.0, 6.0],
[7.0, 2.0, 4.0, 0.0, 11.0, 7.0, 10.0, 4.0, 6.0, 9.0],
[3.0, 14.0, 9.0, 11.0, 0.0, 8.0, 1.0, 13.0, 2.0, 7.0],
[9.0, 5.0, 3.0, 7.0, 8.0, 0.0, 12.0, 5.0, 3.0, 4.0],
[11.0, 13.0, 8.0, 10.0, 1.0, 12.0, 0.0, 6.0, 2.0, 8.0],
[6.0, 7.0, 2.0, 4.0, 13.0, 5.0, 6.0, 0.0, 9.0, 7.0],
[4.0, 12.0, 5.0, 6.0, 2.0, 3.0, 2.0, 9.0, 0.0, 5.0],
[10.0, 1.0, 6.0, 9.0, 7.0, 4.0, 8.0, 7.0, 5.0, 0.0],
]);
let ord = vec![0, 1, 5, 7, 9, 3, 8, 4, 2, 10, 6];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
1.7924414641371267,
0.7673612873305476,
1.0050510774461943,
1.369515830731885,
0.895653572600632,
0.6991658044988632,
1.342306827079896,
0.24534147612643525,
0.9393162245154416,
0.5380188914835948,
0.6473972919269545,
2.0200515908161893,
0.7477352372800302,
0.08314593873568055,
1.9943827151802362,
1.88979374064372,
0.4315906814665401,
1.2899779226681871,
];
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_20() {
let d = arr2(&[
[
0.000000, 0.438878, 0.858598, 0.697368, 0.094177, 0.975622, 0.761140, 0.786064,
0.128114, 0.450386, 0.370798, 0.926765, 0.643865, 0.822762, 0.443414, 0.227239,
0.554585, 0.063817, 0.827631, 0.631664,
],
[
0.438878, 0.000000, 0.970698, 0.893121, 0.778383, 0.194639, 0.466721, 0.043804,
0.154289, 0.683049, 0.744762, 0.967510, 0.325825, 0.370460, 0.469556, 0.189471,
0.129922, 0.475705, 0.226909, 0.669814,
],
[
0.858598, 0.970698, 0.000000, 0.312367, 0.832260, 0.804764, 0.387478, 0.288328,
0.682496, 0.139752, 0.199908, 0.007362, 0.786924, 0.664851, 0.705165, 0.780729,
0.458916, 0.568741, 0.139797, 0.114530,
],
[
0.697368, 0.893121, 0.312367, 0.000000, 0.634718, 0.553579, 0.559207, 0.303950,
0.030818, 0.436717, 0.214585, 0.408529, 0.853403, 0.233939, 0.058303, 0.281384,
0.293594, 0.661917, 0.557032, 0.783898,
],
[
0.094177, 0.778383, 0.832260, 0.634718, 0.000000, 0.090048, 0.722359, 0.461877,
0.161272, 0.501045, 0.152312, 0.696320, 0.446156, 0.381021, 0.301512, 0.630283,
0.361813, 0.087650, 0.118006, 0.961898,
],
[
0.975622, 0.194639, 0.804764, 0.553579, 0.090048, 0.000000, 0.449362, 0.272242,
0.096391, 0.902602, 0.455776, 0.202363, 0.305957, 0.579220, 0.176773, 0.856614,
0.758520, 0.719463, 0.432093, 0.627309,
],
[
0.761140, 0.466721, 0.387478, 0.559207, 0.722359, 0.449362, 0.000000, 0.144524,
0.103403, 0.587645, 0.170593, 0.925120, 0.581061, 0.346870, 0.590915, 0.022804,
0.958559, 0.482303, 0.782735, 0.082730,
],
[
0.786064, 0.043804, 0.288328, 0.303950, 0.461877, 0.272242, 0.144524, 0.000000,
0.438911, 0.021612, 0.826292, 0.896161, 0.140249, 0.554036, 0.108576, 0.672240,
0.281234, 0.659423, 0.726995, 0.768647,
],
[
0.128114, 0.154289, 0.682496, 0.030818, 0.161272, 0.096391, 0.103403, 0.438911,
0.000000, 0.952899, 0.290918, 0.515057, 0.255965, 0.936044, 0.164608, 0.044911,
0.435097, 0.992376, 0.891677, 0.748608,
],
[
0.450386, 0.683049, 0.139752, 0.436717, 0.501045, 0.902602, 0.587645, 0.021612,
0.952899, 0.000000, 0.936813, 0.240971, 0.122758, 0.831113, 0.153284, 0.179268,
0.599383, 0.874562, 0.196435, 0.310324,
],
[
0.370798, 0.744762, 0.199908, 0.214585, 0.152312, 0.455776, 0.170593, 0.826292,
0.290918, 0.936813, 0.000000, 0.581117, 0.199776, 0.804125, 0.715407, 0.738984,
0.131058, 0.123754, 0.927563, 0.397578,
],
[
0.926765, 0.967510, 0.007362, 0.408529, 0.696320, 0.202363, 0.925120, 0.896161,
0.515057, 0.240971, 0.581117, 0.000000, 0.966232, 0.596043, 0.933023, 0.804361,
0.467382, 0.784763, 0.017837, 0.109144,
],
[
0.643865, 0.325825, 0.786924, 0.853403, 0.446156, 0.305957, 0.581061, 0.140249,
0.255965, 0.122758, 0.199776, 0.966232, 0.000000, 0.247840, 0.236662, 0.746014,
0.816569, 0.105278, 0.066559, 0.594434,
],
[
0.822762, 0.370460, 0.664851, 0.233939, 0.381021, 0.579220, 0.346870, 0.554036,
0.936044, 0.831113, 0.804125, 0.596043, 0.247840, 0.000000, 0.680715, 0.393630,
0.317991, 0.504526, 0.875005, 0.851132,
],
[
0.443414, 0.469556, 0.705165, 0.058303, 0.301512, 0.176773, 0.590915, 0.108576,
0.164608, 0.153284, 0.715407, 0.933023, 0.236662, 0.680715, 0.000000, 0.902653,
0.979571, 0.802026, 0.779478, 0.642483,
],
[
0.227239, 0.189471, 0.780729, 0.281384, 0.630283, 0.856614, 0.022804, 0.672240,
0.044911, 0.179268, 0.738984, 0.804361, 0.746014, 0.393630, 0.902653, 0.000000,
0.379464, 0.685743, 0.296876, 0.948858,
],
[
0.554585, 0.129922, 0.458916, 0.293594, 0.361813, 0.758520, 0.958559, 0.281234,
0.435097, 0.599383, 0.131058, 0.467382, 0.816569, 0.317991, 0.979571, 0.379464,
0.000000, 0.725716, 0.084493, 0.935940,
],
[
0.063817, 0.475705, 0.568741, 0.661917, 0.087650, 0.719463, 0.482303, 0.659423,
0.992376, 0.874562, 0.123754, 0.784763, 0.105278, 0.504526, 0.802026, 0.685743,
0.725716, 0.000000, 0.492153, 0.599593,
],
[
0.827631, 0.226909, 0.139797, 0.557032, 0.118006, 0.432093, 0.782735, 0.726995,
0.891677, 0.196435, 0.927563, 0.017837, 0.066559, 0.875005, 0.779478, 0.296876,
0.084493, 0.492153, 0.000000, 0.729686,
],
[
0.631664, 0.669814, 0.114530, 0.783898, 0.961898, 0.627309, 0.082730, 0.768647,
0.748608, 0.310324, 0.397578, 0.109144, 0.594434, 0.851132, 0.642483, 0.948858,
0.935940, 0.599593, 0.729686, 0.000000,
],
]);
let ord = vec![
0, 1, 18, 11, 20, 12, 3, 19, 17, 2, 14, 6, 4, 15, 8, 10, 13, 7, 16, 9, 5,
];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
0.04747073292009973,
0.007701612616020058,
0.07444016201336935,
0.06789766705771873,
0.02630642598877114,
0.10194546998206505,
0.06073245104179167,
0.0683313206520417,
0.04005286248655617,
0.09191359064438706,
0.012365602069513485,
0.12857462752240228,
0.09984787893965927,
0.016672275496657778,
0.028324165205544625,
0.09037640720098351,
0.09778057553901492,
0.016436851573113517,
0.013119574945702001,
0.019374696717817545,
0.009733251103374608,
0.17753642308661646,
0.013374137455845701,
0.15158252481076986,
0.02475755449753652,
0.02230274323604156,
0.09231035708002332,
0.029744612006332088,
0.13842653829605708,
0.008186357129676,
0.0034127118736472783,
0.04182264755520201,
0.016584870701119237,
0.01940042861403799,
0.002928640891889148,
0.10084760318462828,
0.09966788081219224,
];
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_30() {
let d = arr2(&[
[
0.00, 4.09, 0.33, 3.16, 4.69, 0.09, 2.33, 0.16, 2.40, 3.37, 0.55, 0.92, 0.09, 0.89,
1.54, 0.63, 2.04, 1.95, 1.51, 1.99, 3.01, 3.06, 1.28, 2.33, 4.40, 1.92, 1.68, 0.59,
3.76, 0.62,
],
[
4.09, 0.00, 3.70, 0.91, 1.56, 1.04, 3.97, 2.83, 2.06, 2.50, 0.59, 2.45, 4.81, 4.86,
1.71, 0.68, 2.78, 4.21, 3.53, 0.95, 2.38, 1.99, 4.57, 2.24, 3.31, 1.23, 3.66, 2.81,
0.40, 0.97,
],
[
0.33, 3.70, 0.00, 3.24, 0.08, 3.13, 4.49, 2.38, 3.36, 1.40, 1.72, 2.36, 0.63, 3.13,
3.31, 3.65, 0.86, 3.84, 0.46, 2.49, 3.19, 2.59, 2.41, 4.93, 4.24, 0.06, 0.41, 4.93,
3.74, 3.64,
],
[
3.16, 0.91, 3.24, 0.00, 4.00, 1.35, 1.53, 4.81, 2.88, 2.74, 4.28, 1.47, 4.66, 3.14,
2.23, 3.00, 3.28, 0.07, 4.61, 3.73, 0.62, 2.06, 2.85, 2.83, 1.92, 2.68, 0.51, 3.81,
1.24, 4.40,
],
[
4.69, 1.56, 0.08, 4.00, 0.00, 0.33, 4.28, 0.55, 4.06, 3.71, 3.86, 0.21, 3.62, 0.62,
0.71, 1.37, 3.97, 4.83, 1.38, 3.46, 1.24, 4.90, 0.47, 3.98, 3.63, 4.32, 0.77, 1.37,
2.61, 1.22,
],
[
0.09, 1.04, 3.13, 1.35, 0.33, 0.00, 1.25, 1.49, 3.49, 2.22, 4.45, 3.44, 2.80, 0.81,
2.67, 2.95, 1.64, 0.71, 3.28, 3.57, 0.31, 4.68, 3.58, 1.54, 4.11, 3.17, 2.40, 3.05,
3.78, 3.92,
],
[
2.33, 3.97, 4.49, 1.53, 4.28, 1.25, 0.00, 2.14, 3.55, 2.94, 0.25, 0.51, 0.39, 0.45,
1.69, 3.43, 1.11, 0.45, 3.53, 4.63, 3.68, 2.75, 2.72, 0.43, 2.35, 2.87, 2.45, 0.39,
2.95, 0.06,
],
[
0.16, 2.83, 2.38, 4.81, 0.55, 1.49, 2.14, 0.00, 1.32, 4.21, 4.47, 1.86, 1.12, 4.92,
3.44, 3.67, 4.36, 1.53, 0.31, 2.23, 0.41, 4.83, 1.03, 2.85, 4.94, 3.51, 0.03, 2.31,
1.78, 4.99,
],
[
2.40, 2.06, 3.36, 2.88, 4.06, 3.49, 3.55, 1.32, 0.00, 4.35, 4.04, 2.02, 1.47, 4.28,
3.72, 2.13, 0.03, 1.62, 3.74, 2.56, 3.43, 2.01, 0.24, 1.81, 4.47, 1.56, 4.30, 0.83,
4.06, 0.11,
],
[
3.37, 2.50, 1.40, 2.74, 3.71, 2.22, 2.94, 4.21, 4.35, 0.00, 3.00, 1.72, 1.97, 0.25,
1.24, 1.97, 3.24, 1.26, 0.52, 2.61, 0.70, 2.87, 2.60, 0.34, 2.66, 3.69, 0.39, 2.99,
1.25, 0.23,
],
[
0.55, 0.59, 1.72, 4.28, 3.86, 4.45, 0.25, 4.47, 4.04, 3.00, 0.00, 1.73, 3.14, 4.79,
0.70, 1.05, 0.04, 4.85, 1.13, 3.79, 3.10, 0.86, 3.13, 1.99, 4.86, 0.76, 4.61, 0.87,
0.76, 3.25,
],
[
0.92, 2.45, 2.36, 1.47, 0.21, 3.44, 0.51, 1.86, 2.02, 1.72, 1.73, 0.00, 3.41, 2.24,
0.20, 4.08, 3.17, 0.96, 3.96, 0.64, 3.33, 0.72, 4.03, 4.34, 3.68, 1.67, 3.91, 2.50,
4.24, 3.76,
],
[
0.09, 4.81, 0.63, 4.66, 3.62, 2.80, 0.39, 1.12, 1.47, 1.97, 3.14, 3.41, 0.00, 4.35,
4.14, 0.90, 2.32, 1.29, 3.29, 3.50, 1.03, 2.66, 2.15, 3.32, 3.55, 2.33, 2.39, 0.23,
4.60, 4.48,
],
[
0.89, 4.86, 3.13, 3.14, 0.62, 0.81, 0.45, 4.92, 4.28, 0.25, 4.79, 2.24, 4.35, 0.00,
1.22, 2.79, 4.40, 4.37, 4.04, 2.30, 1.14, 1.57, 2.34, 2.92, 3.91, 3.73, 1.16, 1.07,
0.92, 0.42,
],
[
1.54, 1.71, 3.31, 2.23, 0.71, 2.67, 1.69, 3.44, 3.72, 1.24, 0.70, 0.20, 4.14, 1.22,
0.00, 3.91, 0.29, 3.67, 0.62, 3.69, 1.51, 2.64, 4.53, 2.87, 0.63, 4.51, 0.26, 0.77,
3.59, 3.25,
],
[
0.63, 0.68, 3.65, 3.00, 1.37, 2.95, 3.43, 3.67, 2.13, 1.97, 1.05, 4.08, 0.90, 2.79,
3.91, 0.00, 0.35, 0.08, 2.78, 0.82, 1.87, 1.13, 2.79, 4.94, 3.20, 1.62, 1.28, 4.40,
3.62, 0.67,
],
[
2.04, 2.78, 0.86, 3.28, 3.97, 1.64, 1.11, 4.36, 0.03, 3.24, 0.04, 3.17, 2.32, 4.40,
0.29, 0.35, 0.00, 0.72, 3.74, 2.29, 2.35, 0.03, 4.84, 2.88, 1.52, 2.54, 3.54, 2.08,
1.15, 2.90,
],
[
1.95, 4.21, 3.84, 0.07, 4.83, 0.71, 0.45, 1.53, 1.62, 1.26, 4.85, 0.96, 1.29, 4.37,
3.67, 0.08, 0.72, 0.00, 1.15, 0.42, 3.81, 0.09, 4.51, 2.17, 4.44, 3.27, 1.80, 2.24,
1.43, 0.07,
],
[
1.51, 3.53, 0.46, 4.61, 1.38, 3.28, 3.53, 0.31, 3.74, 0.52, 1.13, 3.96, 3.29, 4.04,
0.62, 2.78, 3.74, 1.15, 0.00, 3.86, 2.27, 0.90, 2.64, 2.53, 3.87, 3.11, 1.73, 3.74,
0.61, 3.64,
],
[
1.99, 0.95, 2.49, 3.73, 3.46, 3.57, 4.63, 2.23, 2.56, 2.61, 3.79, 0.64, 3.50, 2.30,
3.69, 0.82, 2.29, 0.42, 3.86, 0.00, 4.33, 0.43, 4.52, 1.18, 4.96, 1.14, 3.76, 2.68,
2.40, 1.48,
],
[
3.01, 2.38, 3.19, 0.62, 1.24, 0.31, 3.68, 0.41, 3.43, 0.70, 3.10, 3.33, 1.03, 1.14,
1.51, 1.87, 2.35, 3.81, 2.27, 4.33, 0.00, 2.79, 0.55, 0.89, 2.57, 1.66, 3.83, 3.94,
4.42, 4.16,
],
[
3.06, 1.99, 2.59, 2.06, 4.90, 4.68, 2.75, 4.83, 2.01, 2.87, 0.86, 0.72, 2.66, 1.57,
2.64, 1.13, 0.03, 0.09, 0.90, 0.43, 2.79, 0.00, 1.10, 4.74, 0.55, 3.11, 2.70, 0.08,
2.47, 2.10,
],
[
1.28, 4.57, 2.41, 2.85, 0.47, 3.58, 2.72, 1.03, 0.24, 2.60, 3.13, 4.03, 2.15, 2.34,
4.53, 2.79, 4.84, 4.51, 2.64, 4.52, 0.55, 1.10, 0.00, 0.02, 0.04, 1.44, 4.21, 4.66,
2.14, 1.87,
],
[
2.33, 2.24, 4.93, 2.83, 3.98, 1.54, 0.43, 2.85, 1.81, 0.34, 1.99, 4.34, 3.32, 2.92,
2.87, 4.94, 2.88, 2.17, 2.53, 1.18, 0.89, 4.74, 0.02, 0.00, 3.68, 4.34, 3.15, 3.48,
0.11, 3.72,
],
[
4.40, 3.31, 4.24, 1.92, 3.63, 4.11, 2.35, 4.94, 4.47, 2.66, 4.86, 3.68, 3.55, 3.91,
0.63, 3.20, 1.52, 4.44, 3.87, 4.96, 2.57, 0.55, 0.04, 3.68, 0.00, 3.22, 2.47, 3.41,
2.32, 4.86,
],
[
1.92, 1.23, 0.06, 2.68, 4.32, 3.17, 2.87, 3.51, 1.56, 3.69, 0.76, 1.67, 2.33, 3.73,
4.51, 1.62, 2.54, 3.27, 3.11, 1.14, 1.66, 3.11, 1.44, 4.34, 3.22, 0.00, 1.57, 4.16,
2.53, 2.38,
],
[
1.68, 3.66, 0.41, 0.51, 0.77, 2.40, 2.45, 0.03, 4.30, 0.39, 4.61, 3.91, 2.39, 1.16,
0.26, 1.28, 3.54, 1.80, 1.73, 3.76, 3.83, 2.70, 4.21, 3.15, 2.47, 1.57, 0.00, 1.18,
2.48, 4.63,
],
[
0.59, 2.81, 4.93, 3.81, 1.37, 3.05, 0.39, 2.31, 0.83, 2.99, 0.87, 2.50, 0.23, 1.07,
0.77, 4.40, 2.08, 2.24, 3.74, 2.68, 3.94, 0.08, 4.66, 3.48, 3.41, 4.16, 1.18, 0.00,
2.54, 2.44,
],
[
3.76, 0.40, 3.74, 1.24, 2.61, 3.78, 2.95, 1.78, 4.06, 1.25, 0.76, 4.24, 4.60, 0.92,
3.59, 3.62, 1.15, 1.43, 0.61, 2.40, 4.42, 2.47, 2.14, 0.11, 2.32, 2.53, 2.48, 2.54,
0.00, 2.45,
],
[
0.62, 0.97, 3.64, 4.40, 1.22, 3.92, 0.06, 4.99, 0.11, 0.23, 3.25, 3.76, 4.48, 0.42,
3.25, 0.67, 2.90, 0.07, 3.64, 1.48, 4.16, 2.10, 1.87, 3.72, 4.86, 2.38, 4.63, 2.44,
2.45, 0.00,
],
]);
let ord = vec![
0, 1, 13, 28, 7, 11, 8, 19, 29, 24, 18, 4, 21, 6, 10, 14, 30, 27, 5, 12, 15, 3, 26, 2,
20, 16, 23, 25, 22, 17, 9,
];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
0.358696620762788,
0.330183739626701,
0.0014321488592694755,
0.27847036494835253,
0.07301119977266218,
0.08434212985919985,
0.3494464973418645,
0.44023275216515945,
0.04323172174019664,
0.1275872415099798,
0.05230240925307509,
0.6419109628942133,
0.14441916495881219,
0.029387670893169748,
0.06594605996015755,
0.0390800716545314,
0.16395179971964532,
0.05984793597553581,
0.10039664185696642,
0.232331922722312,
0.41110066983602694,
0.14973665665650626,
0.10287677726916997,
0.29733053270267984,
0.03355329143230482,
0.10839254540519677,
0.46265820373319766,
0.13592882710904433,
0.5199104487988435,
0.05448243850292588,
0.06828659191626944,
0.2657938353115907,
0.11469318868213818,
0.1544740754122397,
0.40676945043058066,
0.06514070611482671,
0.29140935069169666,
0.13637506079405845,
0.2322471589046975,
0.3925776659837304,
0.36974275636937554,
0.19394002011878705,
0.4581090665440813,
0.0033862753520453822,
0.12277773348266303,
0.029308420754505925,
0.8787333219524528,
0.03933874549622763,
0.02217403771353708,
0.4163607981812139,
0.02755480422479689,
0.3647864383580396,
0.3896382189952087,
0.47247414581441255,
0.03358029044716309,
0.19885845228175733,
0.8084304047844406,
0.3136906710573552,
0.3765183561848116,
0.3575322732909258,
0.3531785743641913,
0.36600138671820376,
];
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_50() {
let d = arr2(&[
[
0.000000, 2.083099, 0.050846, 4.126033, 1.493199, 1.842058, 0.968307, 2.830041,
0.808439, 0.621334, 2.164681, 2.810392, 0.871718, 2.766105, 1.774507, 4.790324,
0.456470, 4.893200, 2.060517, 2.208807, 1.654265, 2.322750, 3.528277, 2.889750,
3.988117, 0.084197, 3.839526, 4.385913, 2.107167, 1.178657, 4.598365, 4.367978,
1.236071, 2.479036, 2.489408, 0.111603, 1.266274, 2.618761, 1.596421, 2.854883,
1.389451, 3.094274, 0.629120, 0.903338, 1.061606, 2.120989, 0.529937, 1.109232,
0.303428, 3.581728,
],
[
2.083099, 0.000000, 1.705006, 2.763804, 4.133584, 3.411974, 3.310029, 3.767659,
1.824918, 0.312566, 4.569942, 2.362790, 3.161885, 0.438977, 3.237163, 1.466676,
3.225659, 2.556375, 1.353022, 1.754915, 4.530281, 2.324947, 1.536206, 1.760428,
2.130794, 2.712479, 3.064209, 1.580299, 1.270980, 2.215881, 0.414345, 0.885629,
3.467633, 1.337152, 0.382850, 1.176734, 3.784147, 2.337486, 0.291088, 3.087164,
1.338903, 4.312580, 3.326509, 0.746219, 0.683141, 2.719320, 0.784471, 0.607045,
3.650156, 4.161330,
],
[
0.050846, 1.705006, 0.000000, 0.891460, 1.735770, 4.068932, 4.663418, 0.540479,
1.406388, 3.098536, 4.231274, 0.682073, 2.023619, 4.202103, 3.624046, 0.439839,
4.753216, 0.446548, 1.653288, 4.968928, 2.842363, 1.945624, 3.033658, 2.462141,
1.040581, 3.464595, 0.950093, 0.310263, 4.058212, 0.522544, 0.699207, 0.922059,
2.679122, 1.219804, 0.411423, 3.464386, 2.560064, 0.104340, 3.435903, 1.162539,
1.180189, 1.357802, 4.030667, 1.487688, 0.273879, 0.430790, 2.195025, 3.967551,
1.473842, 1.133299,
],
[
4.126033, 2.763804, 0.891460, 0.000000, 4.087746, 4.226850, 1.879485, 0.121081,
0.674082, 1.735421, 0.908544, 1.995936, 0.615149, 3.976555, 2.765716, 0.921110,
2.175830, 4.801263, 0.625590, 3.611083, 4.286970, 4.764709, 0.522214, 3.087757,
0.663572, 4.018397, 3.372073, 4.764542, 1.609387, 3.703684, 3.202493, 1.141147,
1.204460, 0.626131, 1.937146, 0.803653, 0.438382, 0.560464, 1.706469, 0.320600,
0.696769, 0.887609, 0.534678, 1.821505, 2.444189, 2.880247, 0.701676, 2.146239,
0.628092, 3.034897,
],
[
1.493199, 4.133584, 1.735770, 4.087746, 0.000000, 4.326294, 1.678911, 4.177658,
3.518649, 4.547186, 1.191222, 2.881201, 4.462795, 0.642127, 0.175703, 4.447461,
2.726545, 2.187489, 4.907450, 0.687640, 0.300877, 4.227252, 3.512408, 4.970375,
4.008273, 1.908181, 4.422568, 4.894894, 4.862486, 4.634329, 0.970046, 3.415604,
4.804193, 2.596611, 1.469045, 1.977254, 4.903286, 3.017790, 4.087234, 1.455889,
3.949219, 1.890791, 1.351448, 4.096606, 3.358402, 2.999308, 0.290805, 3.102598,
2.868606, 4.604069,
],
[
1.842058, 3.411974, 4.068932, 4.226850, 4.326294, 0.000000, 2.236117, 1.301348,
2.068815, 0.095574, 4.066673, 1.731215, 4.490697, 4.083302, 2.695147, 0.888004,
2.970902, 3.370642, 2.067237, 1.335144, 3.654266, 1.586040, 0.212017, 0.335328,
4.288995, 2.884759, 4.137858, 3.072436, 1.275239, 4.950395, 3.050026, 0.660403,
0.166163, 4.898516, 2.980645, 1.474082, 2.303140, 4.240178, 0.790957, 2.491896,
2.027585, 2.481964, 1.578200, 0.529363, 4.017477, 0.996811, 3.995932, 4.462543,
1.016145, 1.586210,
],
[
0.968307, 3.310029, 4.663418, 1.879485, 1.678911, 2.236117, 0.000000, 2.754880,
4.616347, 4.020460, 0.781692, 0.182191, 2.294999, 3.545103, 2.371821, 2.243563,
3.336079, 1.272015, 1.672777, 4.671350, 1.079555, 0.343563, 2.094953, 2.578117,
1.002329, 1.601300, 3.107688, 3.400108, 2.831642, 2.596707, 0.518826, 1.705204,
1.679433, 4.546739, 2.606177, 1.111221, 2.650282, 1.620523, 4.306538, 1.619701,
0.053758, 0.626114, 1.728392, 1.233144, 2.683444, 1.527773, 4.186339, 4.851652,
1.487683, 1.366698,
],
[
2.830041, 3.767659, 0.540479, 0.121081, 4.177658, 1.301348, 2.754880, 0.000000,
2.436149, 4.342829, 1.754255, 1.264962, 2.571180, 1.286679, 0.468392, 2.792318,
0.548692, 2.368987, 2.244005, 4.184733, 2.591168, 4.741255, 0.344924, 0.432127,
4.020240, 2.540771, 0.319073, 4.864226, 3.814665, 1.977530, 4.479569, 3.322839,
0.664447, 2.628023, 4.676518, 4.204032, 1.463955, 1.198334, 4.651247, 1.675343,
3.794022, 3.209648, 1.291411, 4.834617, 0.596469, 0.888279, 1.052978, 0.738091,
3.247972, 2.779666,
],
[
0.808439, 1.824918, 1.406388, 0.674082, 3.518649, 2.068815, 4.616347, 2.436149,
0.000000, 2.479598, 2.191929, 3.829155, 4.398371, 1.782939, 0.062411, 1.047591,
2.960147, 1.537899, 0.976767, 2.736017, 0.110421, 2.184585, 4.099601, 1.241464,
4.040006, 0.503773, 1.269992, 0.509100, 4.785476, 1.307640, 2.080899, 0.662213,
1.766187, 3.637617, 3.786377, 2.283262, 1.266798, 4.265957, 4.882597, 0.540092,
4.365036, 4.940553, 0.326053, 1.781199, 0.435731, 4.181980, 2.889215, 4.673685,
4.016378, 0.177918,
],
[
0.621334, 0.312566, 3.098536, 1.735421, 4.547186, 0.095574, 4.020460, 4.342829,
2.479598, 0.000000, 4.821913, 1.217827, 0.695335, 2.399445, 4.624054, 0.613609,
0.787077, 1.180753, 4.330763, 2.594857, 3.620225, 0.793810, 1.187865, 0.039721,
4.491874, 3.196833, 0.301075, 0.982919, 3.883740, 3.486260, 4.829393, 4.670597,
1.829836, 3.717963, 2.298984, 1.930315, 0.412029, 1.728467, 2.520629, 4.762175,
1.577651, 4.382241, 4.274326, 1.269997, 2.060230, 4.979897, 4.441296, 2.727853,
2.474231, 3.936979,
],
[
2.164681, 4.569942, 4.231274, 0.908544, 1.191222, 4.066673, 0.781692, 1.754255,
2.191929, 4.821913, 0.000000, 4.068167, 0.820358, 1.262596, 0.129869, 2.455655,
2.642555, 0.167461, 3.438591, 4.341478, 0.471368, 2.453874, 2.342061, 2.970921,
0.502511, 2.950024, 1.819717, 4.831414, 2.799649, 0.703885, 4.657987, 4.652318,
1.008332, 4.693727, 3.427178, 4.563003, 2.408921, 2.024454, 3.636918, 4.390141,
1.679559, 4.211568, 0.943412, 2.321853, 0.035405, 4.430854, 4.814647, 0.715164,
4.961466, 0.127911,
],
[
2.810392, 2.362790, 0.682073, 1.995936, 2.881201, 1.731215, 0.182191, 1.264962,
3.829155, 1.217827, 4.068167, 0.000000, 0.675571, 1.707617, 3.601079, 4.327734,
1.840520, 2.850263, 3.925697, 2.980783, 0.058326, 3.951814, 3.267992, 0.196628,
4.635496, 1.673194, 3.246249, 4.007383, 1.606917, 0.183767, 0.396641, 3.571320,
0.965485, 4.731422, 3.351393, 1.901281, 1.336306, 3.696257, 2.108589, 0.231313,
2.685410, 3.484796, 0.284498, 1.729831, 1.507108, 3.998866, 3.688726, 4.230979,
3.553454, 4.067813,
],
[
0.871718, 3.161885, 2.023619, 0.615149, 4.462795, 4.490697, 2.294999, 2.571180,
4.398371, 0.695335, 0.820358, 0.675571, 0.000000, 1.520406, 4.443786, 2.805832,
3.513741, 1.634168, 1.260141, 4.204382, 0.975051, 1.234130, 0.516682, 3.300701,
4.981636, 1.272745, 1.873742, 2.619401, 3.948173, 4.719349, 3.325987, 3.189403,
4.176525, 3.168619, 1.070946, 4.052427, 2.183184, 2.138059, 2.302481, 1.848659,
4.031111, 3.823829, 3.068761, 2.954238, 0.279163, 0.216878, 3.479540, 4.228671,
2.251231, 0.975705,
],
[
2.766105, 0.438977, 4.202103, 3.976555, 0.642127, 4.083302, 3.545103, 1.286679,
1.782939, 2.399445, 1.262596, 1.707617, 1.520406, 0.000000, 1.768457, 2.428369,
4.014205, 0.841548, 1.796267, 3.818838, 1.842553, 4.544493, 0.271302, 2.013887,
4.328601, 0.372212, 2.853815, 0.851514, 2.131165, 1.523089, 4.173256, 1.157925,
1.375598, 2.920355, 4.955953, 4.083498, 1.170822, 0.498904, 2.010622, 1.305207,
1.981945, 1.607998, 4.203918, 4.774729, 1.417289, 1.090081, 3.860237, 0.755762,
1.290538, 4.057975,
],
[
1.774507, 3.237163, 3.624046, 2.765716, 0.175703, 2.695147, 2.371821, 0.468392,
0.062411, 4.624054, 0.129869, 3.601079, 4.443786, 1.768457, 0.000000, 4.020748,
0.482720, 4.580234, 0.466269, 0.585206, 4.223289, 4.487197, 3.782665, 0.999816,
1.260173, 2.873536, 2.292003, 3.058494, 0.419057, 4.356495, 1.688258, 1.619166,
1.960821, 3.830393, 2.198094, 3.552676, 3.345036, 0.302300, 4.978945, 1.493415,
1.460969, 0.718204, 4.687924, 4.208724, 4.686859, 4.069586, 1.057015, 1.680113,
1.616091, 1.333671,
],
[
4.790324, 1.466676, 0.439839, 0.921110, 4.447461, 0.888004, 2.243563, 2.792318,
1.047591, 0.613609, 2.455655, 4.327734, 2.805832, 2.428369, 4.020748, 0.000000,
0.201564, 1.230931, 3.398096, 0.403199, 1.370571, 4.390923, 1.254827, 4.636088,
1.926192, 4.558081, 2.939071, 2.186535, 0.326054, 1.789864, 1.495443, 3.053663,
2.360949, 4.197789, 0.201728, 4.003345, 1.764818, 0.189641, 4.626221, 3.954580,
0.569198, 4.436312, 3.468508, 2.488106, 2.598463, 3.293426, 4.618595, 3.127798,
4.498247, 3.602292,
],
[
0.456470, 3.225659, 4.753216, 2.175830, 2.726545, 2.970902, 3.336079, 0.548692,
2.960147, 0.787077, 2.642555, 1.840520, 3.513741, 4.014205, 0.482720, 0.201564,
0.000000, 0.936962, 3.317318, 0.987492, 0.919103, 2.359639, 0.568682, 3.035500,
0.640766, 1.463840, 2.496191, 3.188352, 4.315398, 4.432282, 2.917358, 2.521357,
1.860282, 1.997266, 4.137226, 4.079940, 4.602792, 0.608688, 1.837689, 2.421030,
2.439388, 2.657061, 1.105433, 3.325390, 4.998186, 0.694998, 0.155063, 4.919988,
2.924422, 4.626040,
],
[
4.893200, 2.556375, 0.446548, 4.801263, 2.187489, 3.370642, 1.272015, 2.368987,
1.537899, 1.180753, 0.167461, 2.850263, 1.634168, 0.841548, 4.580234, 1.230931,
0.936962, 0.000000, 1.314884, 3.383633, 0.359903, 3.198487, 2.042226, 1.302870,
2.275585, 3.015087, 3.777837, 4.855610, 0.470023, 2.136773, 4.118641, 4.652503,
0.238196, 2.746962, 0.065706, 2.762558, 1.646916, 0.840946, 0.611735, 4.543351,
3.435210, 0.667347, 0.728547, 2.892256, 2.459042, 4.394540, 3.724831, 0.151035,
1.228384, 3.566593,
],
[
2.060517, 1.353022, 1.653288, 0.625590, 4.907450, 2.067237, 1.672777, 2.244005,
0.976767, 4.330763, 3.438591, 3.925697, 1.260141, 1.796267, 0.466269, 3.398096,
3.317318, 1.314884, 0.000000, 1.007200, 4.617969, 3.693487, 2.906760, 4.688338,
0.186274, 0.271363, 0.379920, 0.161823, 3.488705, 2.383626, 4.140930, 2.013210,
1.739274, 1.889594, 2.458062, 0.692388, 1.119320, 1.047092, 0.159568, 4.154979,
4.888158, 4.365926, 3.179521, 0.534850, 0.821094, 1.996997, 1.835369, 1.368350,
3.757724, 0.420435,
],
[
2.208807, 1.754915, 4.968928, 3.611083, 0.687640, 1.335144, 4.671350, 4.184733,
2.736017, 2.594857, 4.341478, 2.980783, 4.204382, 3.818838, 0.585206, 0.403199,
0.987492, 3.383633, 1.007200, 0.000000, 2.026247, 1.480512, 2.862635, 2.696848,
3.485047, 4.748010, 2.916169, 1.754050, 2.482729, 1.407575, 1.970639, 1.861828,
3.838512, 2.742374, 0.782222, 0.710709, 2.768980, 0.614760, 0.225183, 1.975721,
0.086915, 2.758688, 1.975202, 1.842625, 3.630357, 3.883051, 0.334458, 2.715866,
4.721299, 0.729724,
],
[
1.654265, 4.530281, 2.842363, 4.286970, 0.300877, 3.654266, 1.079555, 2.591168,
0.110421, 3.620225, 0.471368, 0.058326, 0.975051, 1.842553, 4.223289, 1.370571,
0.919103, 0.359903, 4.617969, 2.026247, 0.000000, 0.055898, 3.734176, 4.117211,
0.088525, 0.818844, 0.294326, 2.519082, 2.696358, 1.688838, 2.626429, 0.513925,
4.064005, 2.599248, 0.583820, 0.246290, 0.645933, 1.844427, 0.462653, 0.415002,
0.943341, 0.323361, 0.190805, 3.640214, 4.851793, 2.168014, 1.748229, 4.762082,
0.152069, 3.016139,
],
[
2.322750, 2.324947, 1.945624, 4.764709, 4.227252, 1.586040, 0.343563, 4.741255,
2.184585, 0.793810, 2.453874, 3.951814, 1.234130, 4.544493, 4.487197, 4.390923,
2.359639, 3.198487, 3.693487, 1.480512, 0.055898, 0.000000, 3.711421, 2.602225,
0.799229, 4.546157, 1.978443, 0.220641, 4.879723, 0.210083, 3.832038, 1.138273,
3.387066, 1.606225, 2.259438, 1.833859, 1.486901, 3.714375, 0.804413, 0.977960,
0.610632, 3.811394, 2.944928, 3.531393, 1.673150, 1.369132, 1.673820, 4.488637,
0.484225, 2.551179,
],
[
3.528277, 1.536206, 3.033658, 0.522214, 3.512408, 0.212017, 2.094953, 0.344924,
4.099601, 1.187865, 2.342061, 3.267992, 0.516682, 0.271302, 3.782665, 1.254827,
0.568682, 2.042226, 2.906760, 2.862635, 3.734176, 3.711421, 0.000000, 0.403645,
4.787159, 4.951598, 0.466419, 2.412135, 0.785668, 2.848013, 3.427480, 2.723376,
0.753378, 4.460581, 3.911346, 4.213903, 4.048780, 0.054945, 0.410096, 4.109647,
2.354602, 1.060198, 2.239150, 3.882275, 1.115835, 3.257331, 3.369168, 1.231779,
0.623522, 0.283364,
],
[
2.889750, 1.760428, 2.462141, 3.087757, 4.970375, 0.335328, 2.578117, 0.432127,
1.241464, 0.039721, 2.970921, 0.196628, 3.300701, 2.013887, 0.999816, 4.636088,
3.035500, 1.302870, 4.688338, 2.696848, 4.117211, 2.602225, 0.403645, 0.000000,
1.318445, 0.276930, 4.017262, 3.873259, 0.732772, 3.457225, 0.191120, 1.922669,
2.940298, 4.774754, 4.987494, 1.021757, 4.933599, 2.414303, 2.301809, 3.930476,
1.720825, 2.258220, 2.443126, 4.661493, 3.151052, 0.305184, 1.564656, 2.739640,
0.183594, 3.928762,
],
[
3.988117, 2.130794, 1.040581, 0.663572, 4.008273, 4.288995, 1.002329, 4.020240,
4.040006, 4.491874, 0.502511, 4.635496, 4.981636, 4.328601, 1.260173, 1.926192,
0.640766, 2.275585, 0.186274, 3.485047, 0.088525, 0.799229, 4.787159, 1.318445,
0.000000, 1.816767, 3.181925, 1.481399, 3.374249, 0.483256, 0.296781, 0.667706,
0.905086, 0.248615, 4.701770, 0.134114, 3.977772, 0.942091, 4.691006, 1.762346,
2.021108, 2.656598, 0.864807, 2.487962, 0.455889, 4.163107, 0.897541, 4.841008,
4.888763, 2.826829,
],
[
0.084197, 2.712479, 3.464595, 4.018397, 1.908181, 2.884759, 1.601300, 2.540771,
0.503773, 3.196833, 2.950024, 1.673194, 1.272745, 0.372212, 2.873536, 4.558081,
1.463840, 3.015087, 0.271363, 4.748010, 0.818844, 4.546157, 4.951598, 0.276930,
1.816767, 0.000000, 4.841372, 0.259773, 4.416078, 1.807671, 0.884208, 0.259542,
1.890519, 4.003394, 0.949910, 2.980783, 3.189090, 0.286990, 1.760764, 1.286441,
1.659038, 4.225094, 4.884456, 2.469491, 4.817424, 4.869133, 4.955546, 0.950482,
0.522929, 2.991018,
],
[
3.839526, 3.064209, 0.950093, 3.372073, 4.422568, 4.137858, 3.107688, 0.319073,
1.269992, 0.301075, 1.819717, 3.246249, 1.873742, 2.853815, 2.292003, 2.939071,
2.496191, 3.777837, 0.379920, 2.916169, 0.294326, 1.978443, 0.466419, 4.017262,
3.181925, 4.841372, 0.000000, 0.208524, 3.884442, 4.909628, 3.255697, 2.074556,
2.612258, 2.638632, 3.393548, 4.019043, 1.561679, 4.741800, 2.920615, 2.199015,
2.069775, 2.270525, 0.409269, 1.740509, 0.201381, 3.096499, 1.397196, 0.912604,
1.411226, 0.949129,
],
[
4.385913, 1.580299, 0.310263, 4.764542, 4.894894, 3.072436, 3.400108, 4.864226,
0.509100, 0.982919, 4.831414, 4.007383, 2.619401, 0.851514, 3.058494, 2.186535,
3.188352, 4.855610, 0.161823, 1.754050, 2.519082, 0.220641, 2.412135, 3.873259,
1.481399, 0.259773, 0.208524, 0.000000, 0.273348, 3.562300, 1.061876, 1.753793,
2.132398, 0.793447, 3.281668, 2.243581, 3.287949, 4.985887, 0.490293, 3.866862,
2.211345, 4.626676, 1.543839, 1.354281, 3.029314, 3.481844, 3.951971, 1.130072,
2.063491, 2.640906,
],
[
2.107167, 1.270980, 4.058212, 1.609387, 4.862486, 1.275239, 2.831642, 3.814665,
4.785476, 3.883740, 2.799649, 1.606917, 3.948173, 2.131165, 0.419057, 0.326054,
4.315398, 0.470023, 3.488705, 2.482729, 2.696358, 4.879723, 0.785668, 0.732772,
3.374249, 4.416078, 3.884442, 0.273348, 0.000000, 0.938512, 2.039878, 0.591816,
4.613702, 1.928260, 4.046106, 0.953793, 0.991553, 1.904415, 2.359173, 4.753850,
0.881422, 4.190880, 2.403682, 1.262263, 3.064121, 2.408634, 0.401400, 2.723379,
2.014923, 3.480287,
],
[
1.178657, 2.215881, 0.522544, 3.703684, 4.634329, 4.950395, 2.596707, 1.977530,
1.307640, 3.486260, 0.703885, 0.183767, 4.719349, 1.523089, 4.356495, 1.789864,
4.432282, 2.136773, 2.383626, 1.407575, 1.688838, 0.210083, 2.848013, 3.457225,
0.483256, 1.807671, 4.909628, 3.562300, 0.938512, 0.000000, 2.087699, 3.323969,
1.278113, 1.329700, 0.819633, 3.592700, 1.257151, 0.513696, 4.023940, 3.328233,
3.432503, 1.405373, 3.232038, 2.461239, 0.244753, 4.004601, 0.159166, 4.075543,
4.949073, 2.365991,
],
[
4.598365, 0.414345, 0.699207, 3.202493, 0.970046, 3.050026, 0.518826, 4.479569,
2.080899, 4.829393, 4.657987, 0.396641, 3.325987, 4.173256, 1.688258, 1.495443,
2.917358, 4.118641, 4.140930, 1.970639, 2.626429, 3.832038, 3.427480, 0.191120,
0.296781, 0.884208, 3.255697, 1.061876, 2.039878, 2.087699, 0.000000, 1.744245,
0.852430, 2.203696, 2.514389, 0.313072, 0.136351, 0.542176, 2.520228, 1.609365,
4.156122, 3.258831, 1.332185, 0.379557, 4.439225, 3.599617, 0.934059, 1.869736,
3.720527, 3.227275,
],
[
4.367978, 0.885629, 0.922059, 1.141147, 3.415604, 0.660403, 1.705204, 3.322839,
0.662213, 4.670597, 4.652318, 3.571320, 3.189403, 1.157925, 1.619166, 3.053663,
2.521357, 4.652503, 2.013210, 1.861828, 0.513925, 1.138273, 2.723376, 1.922669,
0.667706, 0.259542, 2.074556, 1.753793, 0.591816, 3.323969, 1.744245, 0.000000,
1.299325, 3.707693, 2.222244, 3.603341, 1.376858, 1.273668, 0.751166, 0.514802,
2.163993, 4.162563, 4.992546, 3.675459, 4.601214, 3.059424, 3.532615, 4.124473,
1.572497, 1.270073,
],
[
1.236071, 3.467633, 2.679122, 1.204460, 4.804193, 0.166163, 1.679433, 0.664447,
1.766187, 1.829836, 1.008332, 0.965485, 4.176525, 1.375598, 1.960821, 2.360949,
1.860282, 0.238196, 1.739274, 3.838512, 4.064005, 3.387066, 0.753378, 2.940298,
0.905086, 1.890519, 2.612258, 2.132398, 4.613702, 1.278113, 0.852430, 1.299325,
0.000000, 2.667486, 1.480206, 0.559430, 0.654931, 3.858055, 4.494892, 0.515238,
0.577848, 3.329278, 3.636755, 1.486154, 2.698223, 1.083571, 1.387748, 2.188000,
3.829054, 3.013131,
],
[
2.479036, 1.337152, 1.219804, 0.626131, 2.596611, 4.898516, 4.546739, 2.628023,
3.637617, 3.717963, 4.693727, 4.731422, 3.168619, 2.920355, 3.830393, 4.197789,
1.997266, 2.746962, 1.889594, 2.742374, 2.599248, 1.606225, 4.460581, 4.774754,
0.248615, 4.003394, 2.638632, 0.793447, 1.928260, 1.329700, 2.203696, 3.707693,
2.667486, 0.000000, 1.130718, 1.434993, 3.439417, 3.771064, 1.288143, 2.370951,
2.593391, 0.301788, 1.092762, 4.866803, 3.954852, 2.161658, 3.828351, 4.173784,
3.194372, 4.183142,
],
[
2.489408, 0.382850, 0.411423, 1.937146, 1.469045, 2.980645, 2.606177, 4.676518,
3.786377, 2.298984, 3.427178, 3.351393, 1.070946, 4.955953, 2.198094, 0.201728,
4.137226, 0.065706, 2.458062, 0.782222, 0.583820, 2.259438, 3.911346, 4.987494,
4.701770, 0.949910, 3.393548, 3.281668, 4.046106, 0.819633, 2.514389, 2.222244,
1.480206, 1.130718, 0.000000, 4.029924, 4.202336, 0.929974, 4.804096, 0.708614,
3.672984, 1.160466, 1.445954, 2.929875, 1.601772, 3.067054, 1.947811, 0.508263,
0.628553, 0.788487,
],
[
0.111603, 1.176734, 3.464386, 0.803653, 1.977254, 1.474082, 1.111221, 4.204032,
2.283262, 1.930315, 4.563003, 1.901281, 4.052427, 4.083498, 3.552676, 4.003345,
4.079940, 2.762558, 0.692388, 0.710709, 0.246290, 1.833859, 4.213903, 1.021757,
0.134114, 2.980783, 4.019043, 2.243581, 0.953793, 3.592700, 0.313072, 3.603341,
0.559430, 1.434993, 4.029924, 0.000000, 2.983798, 1.859756, 1.620315, 1.520984,
0.985269, 0.513951, 0.696436, 0.326349, 4.296083, 3.707974, 1.332331, 1.273808,
1.917771, 3.994259,
],
[
1.266274, 3.784147, 2.560064, 0.438382, 4.903286, 2.303140, 2.650282, 1.463955,
1.266798, 0.412029, 2.408921, 1.336306, 2.183184, 1.170822, 3.345036, 1.764818,
4.602792, 1.646916, 1.119320, 2.768980, 0.645933, 1.486901, 4.048780, 4.933599,
3.977772, 3.189090, 1.561679, 3.287949, 0.991553, 1.257151, 0.136351, 1.376858,
0.654931, 3.439417, 4.202336, 2.983798, 0.000000, 2.393373, 2.905157, 4.468266,
1.042536, 3.137237, 3.113402, 1.385618, 3.846816, 2.282955, 1.692232, 3.914000,
2.241582, 2.850021,
],
[
2.618761, 2.337486, 0.104340, 0.560464, 3.017790, 4.240178, 1.620523, 1.198334,
4.265957, 1.728467, 2.024454, 3.696257, 2.138059, 0.498904, 0.302300, 0.189641,
0.608688, 0.840946, 1.047092, 0.614760, 1.844427, 3.714375, 0.054945, 2.414303,
0.942091, 0.286990, 4.741800, 4.985887, 1.904415, 0.513696, 0.542176, 1.273668,
3.858055, 3.771064, 0.929974, 1.859756, 2.393373, 0.000000, 0.087698, 2.685379,
3.751035, 4.220945, 0.724637, 4.382914, 1.519193, 2.535357, 1.610193, 4.201064,
0.423902, 0.876276,
],
[
1.596421, 0.291088, 3.435903, 1.706469, 4.087234, 0.790957, 4.306538, 4.651247,
4.882597, 2.520629, 3.636918, 2.108589, 2.302481, 2.010622, 4.978945, 4.626221,
1.837689, 0.611735, 0.159568, 0.225183, 0.462653, 0.804413, 0.410096, 2.301809,
4.691006, 1.760764, 2.920615, 0.490293, 2.359173, 4.023940, 2.520228, 0.751166,
4.494892, 1.288143, 4.804096, 1.620315, 2.905157, 0.087698, 0.000000, 1.112454,
0.866777, 0.108517, 1.991404, 0.773546, 0.088857, 4.347662, 2.918745, 3.706553,
4.316473, 1.850779,
],
[
2.854883, 3.087164, 1.162539, 0.320600, 1.455889, 2.491896, 1.619701, 1.675343,
0.540092, 4.762175, 4.390141, 0.231313, 1.848659, 1.305207, 1.493415, 3.954580,
2.421030, 4.543351, 4.154979, 1.975721, 0.415002, 0.977960, 4.109647, 3.930476,
1.762346, 1.286441, 2.199015, 3.866862, 4.753850, 3.328233, 1.609365, 0.514802,
0.515238, 2.370951, 0.708614, 1.520984, 4.468266, 2.685379, 1.112454, 0.000000,
3.227866, 3.037195, 1.112379, 1.137972, 2.902413, 1.231172, 4.373105, 3.597107,
0.042389, 3.919936,
],
[
1.389451, 1.338903, 1.180189, 0.696769, 3.949219, 2.027585, 0.053758, 3.794022,
4.365036, 1.577651, 1.679559, 2.685410, 4.031111, 1.981945, 1.460969, 0.569198,
2.439388, 3.435210, 4.888158, 0.086915, 0.943341, 0.610632, 2.354602, 1.720825,
2.021108, 1.659038, 2.069775, 2.211345, 0.881422, 3.432503, 4.156122, 2.163993,
0.577848, 2.593391, 3.672984, 0.985269, 1.042536, 3.751035, 0.866777, 3.227866,
0.000000, 4.492548, 1.296649, 0.583657, 1.465431, 2.799955, 3.238487, 3.564759,
4.087674, 0.444271,
],
[
3.094274, 4.312580, 1.357802, 0.887609, 1.890791, 2.481964, 0.626114, 3.209648,
4.940553, 4.382241, 4.211568, 3.484796, 3.823829, 1.607998, 0.718204, 4.436312,
2.657061, 0.667347, 4.365926, 2.758688, 0.323361, 3.811394, 1.060198, 2.258220,
2.656598, 4.225094, 2.270525, 4.626676, 4.190880, 1.405373, 3.258831, 4.162563,
3.329278, 0.301788, 1.160466, 0.513951, 3.137237, 4.220945, 0.108517, 3.037195,
4.492548, 0.000000, 4.809379, 4.842319, 2.978947, 4.910157, 1.800246, 4.453013,
1.689563, 2.686687,
],
[
0.629120, 3.326509, 4.030667, 0.534678, 1.351448, 1.578200, 1.728392, 1.291411,
0.326053, 4.274326, 0.943412, 0.284498, 3.068761, 4.203918, 4.687924, 3.468508,
1.105433, 0.728547, 3.179521, 1.975202, 0.190805, 2.944928, 2.239150, 2.443126,
0.864807, 4.884456, 0.409269, 1.543839, 2.403682, 3.232038, 1.332185, 4.992546,
3.636755, 1.092762, 1.445954, 0.696436, 3.113402, 0.724637, 1.991404, 1.112379,
1.296649, 4.809379, 0.000000, 0.108862, 0.310905, 1.567246, 0.241897, 1.721817,
1.652693, 0.564631,
],
[
0.903338, 0.746219, 1.487688, 1.821505, 4.096606, 0.529363, 1.233144, 4.834617,
1.781199, 1.269997, 2.321853, 1.729831, 2.954238, 4.774729, 4.208724, 2.488106,
3.325390, 2.892256, 0.534850, 1.842625, 3.640214, 3.531393, 3.882275, 4.661493,
2.487962, 2.469491, 1.740509, 1.354281, 1.262263, 2.461239, 0.379557, 3.675459,
1.486154, 4.866803, 2.929875, 0.326349, 1.385618, 4.382914, 0.773546, 1.137972,
0.583657, 4.842319, 0.108862, 0.000000, 4.814218, 2.431319, 2.901217, 0.781612,
3.610444, 1.292151,
],
[
1.061606, 0.683141, 0.273879, 2.444189, 3.358402, 4.017477, 2.683444, 0.596469,
0.435731, 2.060230, 0.035405, 1.507108, 0.279163, 1.417289, 4.686859, 2.598463,
4.998186, 2.459042, 0.821094, 3.630357, 4.851793, 1.673150, 1.115835, 3.151052,
0.455889, 4.817424, 0.201381, 3.029314, 3.064121, 0.244753, 4.439225, 4.601214,
2.698223, 3.954852, 1.601772, 4.296083, 3.846816, 1.519193, 0.088857, 2.902413,
1.465431, 2.978947, 0.310905, 4.814218, 0.000000, 4.222389, 1.011282, 1.373991,
1.389676, 0.811370,
],
[
2.120989, 2.719320, 0.430790, 2.880247, 2.999308, 0.996811, 1.527773, 0.888279,
4.181980, 4.979897, 4.430854, 3.998866, 0.216878, 1.090081, 4.069586, 3.293426,
0.694998, 4.394540, 1.996997, 3.883051, 2.168014, 1.369132, 3.257331, 0.305184,
4.163107, 4.869133, 3.096499, 3.481844, 2.408634, 4.004601, 3.599617, 3.059424,
1.083571, 2.161658, 3.067054, 3.707974, 2.282955, 2.535357, 4.347662, 1.231172,
2.799955, 4.910157, 1.567246, 2.431319, 4.222389, 0.000000, 4.042210, 0.336199,
1.684719, 2.774639,
],
[
0.529937, 0.784471, 2.195025, 0.701676, 0.290805, 3.995932, 4.186339, 1.052978,
2.889215, 4.441296, 4.814647, 3.688726, 3.479540, 3.860237, 1.057015, 4.618595,
0.155063, 3.724831, 1.835369, 0.334458, 1.748229, 1.673820, 3.369168, 1.564656,
0.897541, 4.955546, 1.397196, 3.951971, 0.401400, 0.159166, 0.934059, 3.532615,
1.387748, 3.828351, 1.947811, 1.332331, 1.692232, 1.610193, 2.918745, 4.373105,
3.238487, 1.800246, 0.241897, 2.901217, 1.011282, 4.042210, 0.000000, 1.271695,
4.883049, 3.949699,
],
[
1.109232, 0.607045, 3.967551, 2.146239, 3.102598, 4.462543, 4.851652, 0.738091,
4.673685, 2.727853, 0.715164, 4.230979, 4.228671, 0.755762, 1.680113, 3.127798,
4.919988, 0.151035, 1.368350, 2.715866, 4.762082, 4.488637, 1.231779, 2.739640,
4.841008, 0.950482, 0.912604, 1.130072, 2.723379, 4.075543, 1.869736, 4.124473,
2.188000, 4.173784, 0.508263, 1.273808, 3.914000, 4.201064, 3.706553, 3.597107,
3.564759, 4.453013, 1.721817, 0.781612, 1.373991, 0.336199, 1.271695, 0.000000,
3.785757, 2.342757,
],
[
0.303428, 3.650156, 1.473842, 0.628092, 2.868606, 1.016145, 1.487683, 3.247972,
4.016378, 2.474231, 4.961466, 3.553454, 2.251231, 1.290538, 1.616091, 4.498247,
2.924422, 1.228384, 3.757724, 4.721299, 0.152069, 0.484225, 0.623522, 0.183594,
4.888763, 0.522929, 1.411226, 2.063491, 2.014923, 4.949073, 3.720527, 1.572497,
3.829054, 3.194372, 0.628553, 1.917771, 2.241582, 0.423902, 4.316473, 0.042389,
4.087674, 1.689563, 1.652693, 3.610444, 1.389676, 1.684719, 4.883049, 3.785757,
0.000000, 2.942115,
],
[
3.581728, 4.161330, 1.133299, 3.034897, 4.604069, 1.586210, 1.366698, 2.779666,
0.177918, 3.936979, 0.127911, 4.067813, 0.975705, 4.057975, 1.333671, 3.602292,
4.626040, 3.566593, 0.420435, 0.729724, 3.016139, 2.551179, 0.283364, 3.928762,
2.826829, 2.991018, 0.949129, 2.640906, 3.480287, 2.365991, 3.227275, 1.270073,
3.013131, 4.183142, 0.788487, 3.994259, 2.850021, 0.876276, 1.850779, 3.919936,
0.444271, 2.686687, 0.564631, 1.292151, 0.811370, 2.774639, 3.949699, 2.342757,
2.942115, 0.000000,
],
]);
let ord = vec![
0, 1, 3, 43, 17, 47, 22, 25, 4, 37, 34, 5, 11, 18, 26, 6, 48, 38, 16, 27, 45, 33, 19,
42, 8, 12, 40, 46, 36, 32, 21, 13, 44, 2, 39, 29, 10, 24, 7, 20, 28, 31, 9, 14, 49, 15,
30, 41, 50, 23, 35,
];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
0.0031414463651645696,
0.08773338201059247,
0.08162342454750052,
0.6408804650783753,
0.007804340313699002,
0.050315978702023416,
0.2895531498376919,
0.5419388025113142,
0.12534589955178255,
0.5205719590989247,
0.0016192174481358703,
0.05259577491456672,
0.5071923686899196,
0.17315361755639505,
0.177693962569716,
0.2764408594642451,
0.3528650933848121,
0.4736129420768812,
0.5515400740052453,
0.7179160930065294,
0.06616200152790165,
0.5700870071521967,
0.4035382809742245,
0.06008540582186918,
0.046427812697458395,
0.35336581279261053,
0.013657799653282784,
0.21942288128267456,
1.1135268244122976,
1.2476830662534157,
1.3706276687721188,
0.779642286654474,
0.4934252249120688,
0.06386868095418408,
0.07367450068075553,
0.9153008015576732,
0.17834571520419965,
0.720007408803655,
0.8026509088600556,
1.4580799462839085,
0.5382761984084224,
0.22978304851552056,
0.3343597294676884,
0.625455448896146,
0.040874796369079446,
0.01503318259157522,
0.138391684294467,
0.049721502502537714,
0.03293837728055408,
0.03996241825790895,
0.99649110081289,
0.7958595679073617,
0.6658811719557695,
0.3075312814964785,
0.23874708321701854,
0.9768689214038693,
0.3737468221266021,
0.025088333905014793,
0.4073198509625557,
0.07332526870304974,
0.18628535355031484,
0.09241726646863568,
0.0912702428578365,
0.14661090727223056,
0.05397645744600099,
0.1441938445569772,
0.8673215531400833,
0.020711474367315706,
1.089669351575451,
0.9263690806356529,
0.8055665139869371,
0.24077393905478967,
0.3594050655743523,
0.5901276703761755,
0.4180116395515957,
0.35806164209999014,
0.2244636739772873,
0.5996563401909832,
0.2974505943220895,
0.46833474351823723,
0.20575189479280753,
0.8208207681048869,
1.169646912732183,
0.3384284757146677,
0.5126567044505173,
0.11111071529806232,
0.6410745654408102,
0.31959517598518794,
0.8238763296013776,
];
compare_float_array(&weights, &expected, 1e-6);
}
#[test]
fn splitstree4_smoke_60() {
let d = arr2(&[
[
0.000000, 4.837424, 0.832798, 3.332415, 4.828242, 3.191555, 2.997325, 0.227514,
2.959949, 1.841346, 0.766698, 0.298299, 4.471449, 1.911140, 4.326375, 1.102303,
0.950971, 4.002400, 0.593336, 4.869547, 1.182500, 2.198330, 2.502588, 3.364916,
4.962639, 2.889911, 2.326036, 4.212834, 1.144457, 4.908168, 2.573569, 2.730591,
0.578641, 1.785263, 4.517773, 1.034444, 2.251762, 0.713795, 4.588093, 0.903526,
2.326940, 3.508279, 2.708999, 3.692747, 2.442325, 1.334051, 0.459576, 3.946710,
0.055267, 1.099751, 2.925335, 0.773581, 4.922572, 0.285106, 4.989232, 0.901800,
0.578703, 0.256764, 3.590394, 2.761763,
],
[
4.837424, 0.000000, 2.224262, 0.583166, 0.243875, 4.572212, 3.731423, 2.109789,
4.060003, 2.359588, 2.886341, 1.545359, 1.986734, 0.830385, 1.087971, 0.991627,
4.617341, 1.379184, 2.363088, 1.650636, 1.596801, 2.640599, 4.711860, 1.990815,
1.457419, 4.275781, 0.931191, 0.389785, 0.571657, 0.254986, 4.444503, 4.412268,
0.220147, 4.455835, 4.672542, 1.680238, 0.906505, 0.586338, 4.384408, 3.367245,
1.317817, 2.226252, 0.117932, 1.926906, 3.984944, 2.900305, 0.663992, 2.577775,
0.406883, 0.412122, 0.831479, 1.228093, 2.941276, 3.191453, 2.453570, 1.198007,
0.759868, 0.707636, 0.165043, 4.053320,
],
[
0.832798, 2.224262, 0.000000, 3.692518, 2.298332, 4.606596, 0.639236, 2.638277,
2.741446, 4.525402, 2.471473, 1.194953, 1.398052, 1.947577, 1.002394, 1.261713,
1.636250, 1.292121, 4.277783, 4.731814, 4.650363, 0.059840, 4.455962, 2.881052,
1.484300, 4.007376, 3.322989, 0.250343, 3.274816, 2.056950, 3.113979, 4.784652,
4.108563, 4.847654, 2.419078, 2.624086, 1.501364, 4.110375, 4.402477, 3.157938,
3.633570, 4.416333, 4.385257, 2.555327, 1.526944, 4.283946, 2.938336, 1.310284,
0.309163, 1.915014, 4.897499, 2.988141, 1.429985, 4.521935, 2.124790, 0.146247,
2.045570, 0.220002, 0.655630, 2.510744,
],
[
3.332415, 0.583166, 3.692518, 0.000000, 0.848833, 4.112653, 4.277882, 4.874629,
0.766453, 0.706784, 0.568035, 2.156806, 2.117568, 4.859727, 2.113526, 4.820628,
4.667400, 2.937885, 2.786581, 2.747910, 0.832545, 3.033621, 0.224548, 1.591424,
3.452897, 4.214577, 4.842375, 2.452774, 4.921152, 2.562000, 0.974761, 0.233987,
3.306038, 4.074004, 3.102159, 4.074075, 3.577571, 1.580541, 4.517454, 1.830547,
4.093379, 2.026925, 2.985296, 2.271655, 4.391410, 4.347800, 2.081290, 4.249434,
4.279881, 0.717072, 1.118912, 2.369764, 3.314291, 4.062715, 3.252461, 3.098200,
2.706090, 4.017126, 4.747971, 4.264483,
],
[
4.828242, 0.243875, 2.298332, 0.848833, 0.000000, 1.617216, 0.983230, 4.475507,
3.740164, 4.160675, 1.012032, 4.792265, 2.029340, 4.714101, 3.381647, 0.111638,
3.346906, 0.574337, 1.490781, 1.969918, 3.761479, 4.707116, 4.096793, 3.591629,
1.828451, 1.703450, 4.293777, 4.159404, 0.165789, 4.084568, 4.359197, 4.846265,
2.637426, 2.307520, 2.915589, 2.403151, 4.206135, 2.740628, 4.791373, 1.185806,
4.610500, 1.130764, 3.445353, 1.433267, 2.392641, 4.190796, 3.378379, 2.597828,
2.968496, 0.107686, 4.346556, 4.733188, 0.546419, 3.220235, 2.878050, 1.345837,
3.826796, 0.934179, 0.112900, 2.976834,
],
[
3.191555, 4.572212, 4.606596, 4.112653, 1.617216, 0.000000, 0.554609, 0.505201,
4.136130, 2.783352, 0.754842, 4.892160, 4.438646, 4.690204, 3.468713, 4.721082,
0.105114, 1.167451, 4.037957, 2.927091, 4.632753, 4.048725, 1.744453, 4.044755,
1.672780, 4.846782, 2.311383, 2.954097, 4.021710, 4.229886, 4.615824, 3.090816,
0.162982, 4.314055, 4.015598, 2.955012, 2.818509, 4.862907, 4.407127, 4.713721,
0.143158, 3.937372, 0.503919, 1.041033, 1.489056, 4.321681, 4.233458, 4.509882,
4.008125, 4.159782, 2.562929, 3.025159, 4.235115, 2.236781, 2.792522, 4.348121,
2.615496, 1.730010, 4.089230, 2.045845,
],
[
2.997325, 3.731423, 0.639236, 4.277882, 0.983230, 0.554609, 0.000000, 4.288312,
1.602715, 4.226181, 0.398734, 2.903054, 1.126794, 2.433540, 4.562364, 1.054328,
1.607095, 2.239081, 4.472469, 4.520000, 4.622457, 4.996092, 4.398397, 0.898042,
1.080761, 1.277141, 0.645589, 4.058442, 2.263663, 4.357045, 3.253329, 0.566106,
4.456429, 2.919651, 4.270254, 0.212641, 3.835264, 4.778285, 2.764424, 0.981083,
2.080282, 4.468903, 2.071777, 4.047362, 4.638121, 1.582934, 3.598245, 3.588702,
1.010528, 4.890805, 4.741790, 0.274934, 1.569044, 4.563202, 4.751001, 4.449936,
2.329713, 4.385684, 2.927723, 0.592037,
],
[
0.227514, 2.109789, 2.638277, 4.874629, 4.475507, 0.505201, 4.288312, 0.000000,
1.308813, 2.907586, 4.229298, 0.767210, 3.927399, 2.142974, 0.694652, 2.183843,
3.817784, 4.166516, 0.877788, 4.307705, 4.545787, 2.493519, 2.082079, 2.631278,
1.993456, 4.079023, 4.138019, 2.747557, 4.876808, 4.437087, 3.729486, 3.926089,
2.023741, 2.423810, 2.114307, 0.813129, 0.904281, 0.786780, 2.412784, 1.095174,
3.470370, 3.623356, 2.179669, 0.203090, 3.987409, 0.831070, 1.292416, 1.590231,
1.669681, 0.153875, 0.548170, 4.145180, 4.420659, 1.788853, 1.126261, 4.074307,
1.106938, 4.286948, 4.195746, 2.189509,
],
[
2.959949, 4.060003, 2.741446, 0.766453, 3.740164, 4.136130, 1.602715, 1.308813,
0.000000, 4.801567, 2.519102, 0.336695, 0.499518, 2.074640, 4.008478, 4.543378,
4.882791, 0.522503, 1.843092, 1.281768, 4.365503, 3.803658, 3.591370, 2.607278,
4.034857, 4.919673, 2.274621, 2.624819, 0.798295, 4.987697, 4.290249, 4.657265,
1.587782, 3.762310, 2.936618, 3.904602, 4.237559, 4.270392, 0.189642, 1.394876,
1.436553, 2.125902, 4.008005, 2.029780, 4.098334, 1.069718, 4.784356, 3.411624,
4.583627, 4.232934, 3.886021, 4.397545, 4.363117, 4.707714, 4.903547, 0.601168,
2.212727, 3.718491, 0.425954, 4.114706,
],
[
1.841346, 2.359588, 4.525402, 0.706784, 4.160675, 2.783352, 4.226181, 2.907586,
4.801567, 0.000000, 2.443436, 4.333495, 1.365294, 3.007701, 1.677453, 4.268355,
4.871685, 4.247244, 4.502707, 3.172538, 0.894273, 2.567932, 3.408804, 4.133042,
1.143499, 1.514602, 4.043782, 4.047909, 2.703920, 2.603704, 3.316890, 1.525747,
0.749567, 2.081148, 0.204504, 4.560897, 1.139407, 4.178353, 0.755591, 3.642142,
0.409059, 0.723546, 4.564132, 2.775090, 1.043625, 1.155197, 4.052703, 3.378091,
0.340980, 4.456815, 0.343358, 4.825289, 1.663977, 4.722111, 4.090922, 2.337065,
2.717105, 4.025017, 4.724229, 3.050787,
],
[
0.766698, 2.886341, 2.471473, 0.568035, 1.012032, 0.754842, 0.398734, 4.229298,
2.519102, 2.443436, 0.000000, 1.420624, 1.050093, 1.657534, 4.005589, 4.957525,
3.184657, 4.590239, 4.236460, 3.970053, 3.036942, 2.672501, 2.348542, 4.107244,
3.721170, 2.310212, 4.293202, 0.215323, 2.207380, 1.496920, 4.740450, 4.849048,
4.645548, 4.012920, 2.697231, 1.011310, 0.307760, 2.866716, 0.570511, 3.274720,
0.106117, 4.750535, 0.235723, 4.924640, 1.423819, 1.501602, 4.084645, 0.683678,
1.438319, 1.505305, 2.517258, 0.725606, 4.597704, 1.397665, 4.917615, 0.733094,
4.397241, 2.465136, 2.253319, 1.788120,
],
[
0.298299, 1.545359, 1.194953, 2.156806, 4.792265, 4.892160, 2.903054, 0.767210,
0.336695, 4.333495, 1.420624, 0.000000, 4.535357, 2.464924, 0.712451, 4.629592,
0.350351, 3.498031, 0.482112, 0.433289, 3.207180, 1.447495, 2.624383, 0.784317,
4.562322, 0.320249, 3.359172, 1.415803, 2.101799, 2.413629, 2.925786, 2.100315,
4.298405, 2.592074, 1.140094, 3.714317, 4.193920, 0.605992, 0.108039, 4.092828,
4.962971, 1.709613, 2.668719, 4.008243, 2.293551, 0.632796, 1.140646, 1.016851,
3.505270, 0.289254, 2.631256, 3.076811, 1.159531, 2.394972, 0.531590, 0.451326,
4.330926, 1.167943, 3.243198, 2.654404,
],
[
4.471449, 1.986734, 1.398052, 2.117568, 2.029340, 4.438646, 1.126794, 3.927399,
0.499518, 1.365294, 1.050093, 4.535357, 0.000000, 1.860037, 2.824438, 4.023311,
4.187822, 2.427552, 1.669424, 0.871086, 0.398341, 3.873067, 4.883179, 4.229612,
0.810328, 1.779638, 3.875828, 1.524811, 4.484390, 1.855065, 3.282059, 4.345625,
0.626116, 0.942071, 2.761565, 3.658584, 2.058769, 4.148160, 4.306776, 2.411632,
2.507276, 0.446191, 4.888921, 1.592434, 4.961916, 3.159384, 3.171336, 2.005230,
4.753832, 3.297696, 1.148607, 2.202134, 1.838661, 2.362478, 0.326633, 4.267924,
1.757100, 1.746484, 0.062832, 2.483689,
],
[
1.911140, 0.830385, 1.947577, 4.859727, 4.714101, 4.690204, 2.433540, 2.142974,
2.074640, 3.007701, 1.657534, 2.464924, 1.860037, 0.000000, 4.691265, 0.434576,
4.777172, 4.294581, 4.707201, 0.780332, 2.664224, 0.518872, 2.170770, 2.626114,
2.296468, 0.761043, 4.547803, 4.382408, 3.026523, 2.108012, 4.706300, 0.274438,
4.443235, 0.382792, 1.664405, 1.757408, 4.897998, 2.213667, 0.594128, 4.518446,
2.096392, 0.753630, 1.985625, 0.611881, 4.614888, 1.733535, 4.230987, 0.241260,
3.861298, 1.431282, 0.130153, 2.274196, 1.108174, 1.050060, 2.946871, 2.606455,
2.827577, 4.421694, 4.461098, 4.537366,
],
[
4.326375, 1.087971, 1.002394, 2.113526, 3.381647, 3.468713, 4.562364, 0.694652,
4.008478, 1.677453, 4.005589, 0.712451, 2.824438, 4.691265, 0.000000, 3.920402,
1.313635, 4.474440, 2.758540, 1.661109, 3.239373, 0.577056, 2.968054, 4.181100,
0.208820, 3.648990, 4.811410, 1.243330, 1.776900, 2.359469, 4.058183, 0.969902,
2.128008, 2.535616, 3.745449, 4.781940, 1.352527, 2.751882, 2.033222, 2.132772,
2.837784, 3.533584, 1.095731, 1.618817, 1.444635, 1.497457, 4.514280, 0.466712,
1.696782, 0.621041, 1.731986, 4.202123, 4.774702, 0.176741, 1.656622, 0.297967,
4.311971, 0.588142, 1.916189, 4.524938,
],
[
1.102303, 0.991627, 1.261713, 4.820628, 0.111638, 4.721082, 1.054328, 2.183843,
4.543378, 4.268355, 4.957525, 4.629592, 4.023311, 0.434576, 3.920402, 0.000000,
0.990628, 4.145182, 4.365178, 4.215531, 4.727334, 1.009904, 0.336051, 0.896812,
0.799866, 3.299948, 0.543517, 2.167337, 4.014416, 0.194654, 0.970081, 4.986369,
1.560613, 4.027345, 1.769345, 2.025130, 4.418721, 0.338191, 1.924321, 3.051278,
4.568040, 1.916192, 4.208334, 2.101981, 3.149269, 0.244091, 2.829055, 0.917814,
2.406452, 3.015704, 2.365464, 4.071206, 4.247362, 2.274374, 0.160935, 0.405840,
1.084919, 4.360359, 0.442129, 0.963368,
],
[
0.950971, 4.617341, 1.636250, 4.667400, 3.346906, 0.105114, 1.607095, 3.817784,
4.882791, 4.871685, 3.184657, 0.350351, 4.187822, 4.777172, 1.313635, 0.990628,
0.000000, 4.791306, 4.626996, 2.997236, 4.039225, 4.654943, 0.606221, 0.983270,
2.096120, 2.025435, 4.679169, 4.667516, 2.093130, 2.418785, 2.252082, 2.721370,
3.671882, 4.814900, 3.086663, 2.717000, 4.880682, 0.488696, 0.479074, 1.411892,
0.972421, 4.183452, 0.951588, 3.268824, 4.207326, 1.760816, 4.478642, 1.884502,
4.209374, 4.215803, 3.099656, 0.566342, 0.954567, 0.419357, 4.222121, 4.231904,
0.131027, 4.479700, 4.829501, 2.481917,
],
[
4.002400, 1.379184, 1.292121, 2.937885, 0.574337, 1.167451, 2.239081, 4.166516,
0.522503, 4.247244, 4.590239, 3.498031, 2.427552, 4.294581, 4.474440, 4.145182,
4.791306, 0.000000, 0.715295, 4.826536, 4.512860, 3.620585, 1.491160, 4.390316,
1.151432, 3.349632, 0.419948, 4.684244, 3.888989, 1.240125, 4.014036, 2.588158,
1.079940, 4.768247, 0.363775, 4.559715, 4.021074, 4.167764, 0.107861, 2.735377,
4.712775, 0.812606, 0.496545, 3.522216, 3.069419, 1.379934, 0.382188, 4.899893,
2.850354, 1.972511, 0.655705, 3.355536, 2.333178, 4.873020, 1.723763, 2.994384,
1.076928, 4.545864, 1.395865, 4.773448,
],
[
0.593336, 2.363088, 4.277783, 2.786581, 1.490781, 4.037957, 4.472469, 0.877788,
1.843092, 4.502707, 4.236460, 0.482112, 1.669424, 4.707201, 2.758540, 4.365178,
4.626996, 0.715295, 0.000000, 1.225503, 0.859795, 4.344196, 0.478026, 4.499046,
0.634311, 4.749441, 4.272511, 0.511397, 2.077942, 2.737888, 0.400687, 2.400535,
1.461632, 4.302396, 4.200883, 2.295695, 4.128096, 1.468050, 4.440827, 0.424388,
4.807090, 2.183026, 3.293705, 0.845245, 0.243512, 1.852508, 0.098084, 0.809933,
2.593562, 0.776147, 0.983649, 3.422190, 4.656068, 1.448925, 0.953593, 4.838919,
1.551026, 4.717634, 0.188810, 1.513570,
],
[
4.869547, 1.650636, 4.731814, 2.747910, 1.969918, 2.927091, 4.520000, 4.307705,
1.281768, 3.172538, 3.970053, 0.433289, 0.871086, 0.780332, 1.661109, 4.215531,
2.997236, 4.826536, 1.225503, 0.000000, 1.198816, 2.324795, 2.497317, 1.150230,
4.658359, 4.214910, 4.201430, 2.668083, 0.605392, 4.147096, 2.208337, 1.412394,
4.159774, 2.900186, 0.303491, 4.497427, 0.428392, 4.698445, 4.138015, 2.565248,
1.294092, 2.087325, 0.767276, 0.721767, 0.379287, 0.932444, 1.402163, 4.504372,
0.068886, 3.043028, 1.559434, 0.188675, 4.542273, 1.962907, 3.477127, 2.398568,
2.682934, 2.442238, 0.735822, 4.190199,
],
[
1.182500, 1.596801, 4.650363, 0.832545, 3.761479, 4.632753, 4.622457, 4.545787,
4.365503, 0.894273, 3.036942, 3.207180, 0.398341, 2.664224, 3.239373, 4.727334,
4.039225, 4.512860, 0.859795, 1.198816, 0.000000, 1.642526, 3.708477, 2.612367,
4.801807, 1.301291, 2.035515, 1.736806, 0.664202, 0.110779, 0.177366, 2.123524,
4.186693, 2.806890, 0.176866, 0.910631, 3.293299, 1.340322, 0.313934, 4.215844,
1.257870, 2.607760, 1.205704, 2.175595, 3.195266, 2.575460, 0.113105, 4.241622,
0.118432, 0.429566, 0.742375, 2.698247, 2.114605, 4.350465, 1.668767, 3.773346,
4.961482, 4.239940, 4.618262, 3.000183,
],
[
2.198330, 2.640599, 0.059840, 3.033621, 4.707116, 4.048725, 4.996092, 2.493519,
3.803658, 2.567932, 2.672501, 1.447495, 3.873067, 0.518872, 0.577056, 1.009904,
4.654943, 3.620585, 4.344196, 2.324795, 1.642526, 0.000000, 0.359080, 1.612465,
0.695851, 2.057036, 4.474786, 1.208722, 1.357182, 4.928253, 2.830355, 3.339122,
4.430441, 4.542157, 1.164081, 2.432823, 3.610845, 1.086459, 1.097094, 1.289625,
4.035828, 4.462096, 2.539085, 4.844996, 3.519934, 1.782647, 0.111577, 3.522354,
2.618223, 2.275219, 3.383382, 1.258855, 3.399761, 0.806508, 0.429422, 0.538735,
2.597726, 2.421938, 3.949061, 1.195810,
],
[
2.502588, 4.711860, 4.455962, 0.224548, 4.096793, 1.744453, 4.398397, 2.082079,
3.591370, 3.408804, 2.348542, 2.624383, 4.883179, 2.170770, 2.968054, 0.336051,
0.606221, 1.491160, 0.478026, 2.497317, 3.708477, 0.359080, 0.000000, 1.880722,
4.395224, 2.829711, 1.871646, 4.329685, 1.836379, 4.608523, 0.932271, 0.069912,
0.807222, 2.656918, 0.221766, 2.463753, 1.821601, 1.444167, 3.108348, 0.095880,
1.705553, 4.839312, 4.095879, 1.508773, 3.372096, 0.884391, 2.850759, 1.844890,
4.743290, 4.336064, 2.124696, 0.486662, 3.081171, 4.492930, 3.674428, 4.378221,
2.267963, 1.343625, 0.865750, 3.199708,
],
[
3.364916, 1.990815, 2.881052, 1.591424, 3.591629, 4.044755, 0.898042, 2.631278,
2.607278, 4.133042, 4.107244, 0.784317, 4.229612, 2.626114, 4.181100, 0.896812,
0.983270, 4.390316, 4.499046, 1.150230, 2.612367, 1.612465, 1.880722, 0.000000,
4.785243, 1.731886, 0.789833, 4.922026, 0.175754, 0.119666, 3.182616, 0.914704,
1.905954, 4.662786, 1.461359, 0.309807, 1.263633, 1.200063, 2.573067, 4.750709,
4.833637, 3.964780, 4.540156, 3.930465, 0.760055, 4.676833, 3.298376, 2.560888,
0.331088, 1.419930, 1.581828, 4.775650, 2.643864, 4.319733, 1.701672, 1.266722,
2.666077, 4.764264, 1.678684, 0.899362,
],
[
4.962639, 1.457419, 1.484300, 3.452897, 1.828451, 1.672780, 1.080761, 1.993456,
4.034857, 1.143499, 3.721170, 4.562322, 0.810328, 2.296468, 0.208820, 0.799866,
2.096120, 1.151432, 0.634311, 4.658359, 4.801807, 0.695851, 4.395224, 4.785243,
0.000000, 2.927279, 1.402334, 4.567929, 4.247692, 4.074342, 4.043095, 1.127970,
4.853174, 1.317534, 4.486595, 0.305670, 2.930469, 1.888943, 2.401067, 3.948287,
4.988185, 1.509160, 3.018114, 3.882922, 1.977537, 4.312808, 1.474196, 3.227681,
4.163928, 2.308317, 2.446477, 4.737423, 4.869605, 3.272142, 4.902668, 0.067218,
4.350487, 4.628898, 2.701745, 3.265586,
],
[
2.889911, 4.275781, 4.007376, 4.214577, 1.703450, 4.846782, 1.277141, 4.079023,
4.919673, 1.514602, 2.310212, 0.320249, 1.779638, 0.761043, 3.648990, 3.299948,
2.025435, 3.349632, 4.749441, 4.214910, 1.301291, 2.057036, 2.829711, 1.731886,
2.927279, 0.000000, 0.191225, 4.133114, 2.602058, 1.272782, 2.987851, 0.652918,
1.795067, 2.737246, 1.928898, 4.582223, 0.422036, 4.908243, 1.977814, 4.271546,
1.935197, 0.711004, 0.337048, 2.442162, 4.141926, 0.341517, 0.474990, 4.537781,
1.804096, 1.638243, 4.883098, 4.124259, 3.979884, 4.439688, 4.945456, 0.215156,
1.305596, 0.534130, 4.887971, 1.710436,
],
[
2.326036, 0.931191, 3.322989, 4.842375, 4.293777, 2.311383, 0.645589, 4.138019,
2.274621, 4.043782, 4.293202, 3.359172, 3.875828, 4.547803, 4.811410, 0.543517,
4.679169, 0.419948, 4.272511, 4.201430, 2.035515, 4.474786, 1.871646, 0.789833,
1.402334, 0.191225, 0.000000, 0.083749, 4.803832, 0.765936, 3.826625, 0.461742,
2.844512, 0.801689, 4.720233, 4.826534, 3.828421, 1.576075, 4.497419, 0.667558,
0.633619, 3.028421, 0.981903, 4.996224, 4.839184, 1.175581, 0.887586, 0.094959,
1.325515, 2.481982, 4.350843, 3.926477, 3.088951, 4.298731, 0.676756, 0.931481,
2.033594, 2.921946, 1.490809, 2.927134,
],
[
4.212834, 0.389785, 0.250343, 2.452774, 4.159404, 2.954097, 4.058442, 2.747557,
2.624819, 4.047909, 0.215323, 1.415803, 1.524811, 4.382408, 1.243330, 2.167337,
4.667516, 4.684244, 0.511397, 2.668083, 1.736806, 1.208722, 4.329685, 4.922026,
4.567929, 4.133114, 0.083749, 0.000000, 0.612600, 0.474247, 1.346502, 0.411275,
2.711447, 4.366278, 2.678347, 0.816918, 4.480986, 1.848047, 4.485308, 4.127299,
0.305510, 4.269121, 0.953616, 2.739465, 1.709889, 4.232529, 0.252833, 1.415504,
2.410875, 2.062289, 4.795676, 1.642594, 1.500409, 2.346367, 3.723118, 1.728922,
3.821680, 0.182378, 4.233347, 2.442918,
],
[
1.144457, 0.571657, 3.274816, 4.921152, 0.165789, 4.021710, 2.263663, 4.876808,
0.798295, 2.703920, 2.207380, 2.101799, 4.484390, 3.026523, 1.776900, 4.014416,
2.093130, 3.888989, 2.077942, 0.605392, 0.664202, 1.357182, 1.836379, 0.175754,
4.247692, 2.602058, 4.803832, 0.612600, 0.000000, 1.341245, 3.316880, 1.253291,
0.686254, 0.310467, 4.327723, 2.023261, 4.790335, 1.261011, 3.605977, 4.303034,
4.447787, 0.771105, 1.548090, 0.272590, 3.815996, 2.278565, 4.708893, 3.021307,
0.953014, 0.587429, 1.478402, 3.232977, 0.534395, 4.646580, 4.116693, 4.456970,
0.360820, 4.928525, 0.736670, 4.506546,
],
[
4.908168, 0.254986, 2.056950, 2.562000, 4.084568, 4.229886, 4.357045, 4.437087,
4.987697, 2.603704, 1.496920, 2.413629, 1.855065, 2.108012, 2.359469, 0.194654,
2.418785, 1.240125, 2.737888, 4.147096, 0.110779, 4.928253, 4.608523, 0.119666,
4.074342, 1.272782, 0.765936, 0.474247, 1.341245, 0.000000, 1.267503, 2.396323,
3.757911, 1.634812, 1.564121, 1.850197, 4.361629, 0.471950, 1.849619, 3.636584,
2.165899, 4.854558, 3.961720, 3.788388, 4.706004, 4.834473, 3.111274, 2.499110,
3.116941, 0.439488, 4.900626, 4.566134, 4.537229, 1.223784, 3.643570, 4.214771,
2.151247, 1.732594, 1.296173, 4.873501,
],
[
2.573569, 4.444503, 3.113979, 0.974761, 4.359197, 4.615824, 3.253329, 3.729486,
4.290249, 3.316890, 4.740450, 2.925786, 3.282059, 4.706300, 4.058183, 0.970081,
2.252082, 4.014036, 0.400687, 2.208337, 0.177366, 2.830355, 0.932271, 3.182616,
4.043095, 2.987851, 3.826625, 1.346502, 3.316880, 1.267503, 0.000000, 4.200405,
4.505775, 0.904469, 0.458690, 1.849903, 4.724786, 3.940023, 2.352938, 4.109080,
4.500273, 4.720473, 4.162081, 2.404698, 0.265941, 4.107265, 3.198222, 3.978971,
1.694417, 2.732042, 2.469950, 1.180479, 4.388522, 4.216999, 3.149773, 2.299486,
3.206198, 4.455393, 4.700482, 4.705313,
],
[
2.730591, 4.412268, 4.784652, 0.233987, 4.846265, 3.090816, 0.566106, 3.926089,
4.657265, 1.525747, 4.849048, 2.100315, 4.345625, 0.274438, 0.969902, 4.986369,
2.721370, 2.588158, 2.400535, 1.412394, 2.123524, 3.339122, 0.069912, 0.914704,
1.127970, 0.652918, 0.461742, 0.411275, 1.253291, 2.396323, 4.200405, 0.000000,
0.060768, 2.514662, 4.510347, 2.864078, 4.968010, 0.056396, 4.534493, 4.725493,
0.469394, 2.215421, 3.734412, 0.382779, 3.245291, 4.484100, 1.051898, 4.503131,
0.567336, 0.467920, 4.738365, 2.515232, 0.906205, 2.052476, 0.305531, 2.801889,
4.766303, 4.966281, 0.558089, 4.698479,
],
[
0.578641, 0.220147, 4.108563, 3.306038, 2.637426, 0.162982, 4.456429, 2.023741,
1.587782, 0.749567, 4.645548, 4.298405, 0.626116, 4.443235, 2.128008, 1.560613,
3.671882, 1.079940, 1.461632, 4.159774, 4.186693, 4.430441, 0.807222, 1.905954,
4.853174, 1.795067, 2.844512, 2.711447, 0.686254, 3.757911, 4.505775, 0.060768,
0.000000, 4.642692, 3.773936, 4.162937, 4.124551, 4.841591, 2.029159, 1.984858,
0.219099, 1.363012, 3.286959, 4.944757, 1.030732, 3.947551, 3.950365, 0.410266,
2.523034, 0.348420, 0.771401, 1.019689, 2.485043, 2.069265, 4.558173, 4.943771,
0.489457, 1.173462, 2.513525, 0.813032,
],
[
1.785263, 4.455835, 4.847654, 4.074004, 2.307520, 4.314055, 2.919651, 2.423810,
3.762310, 2.081148, 4.012920, 2.592074, 0.942071, 0.382792, 2.535616, 4.027345,
4.814900, 4.768247, 4.302396, 2.900186, 2.806890, 4.542157, 2.656918, 4.662786,
1.317534, 2.737246, 0.801689, 4.366278, 0.310467, 1.634812, 0.904469, 2.514662,
4.642692, 0.000000, 3.125306, 0.122239, 3.310336, 4.101388, 4.854271, 3.310110,
4.323796, 0.441802, 2.118376, 1.302228, 1.121309, 4.722457, 4.307813, 4.765479,
4.266994, 4.895035, 4.481559, 4.060477, 0.392090, 0.945692, 4.314302, 1.111926,
3.924826, 4.555940, 4.675767, 0.764524,
],
[
4.517773, 4.672542, 2.419078, 3.102159, 2.915589, 4.015598, 4.270254, 2.114307,
2.936618, 0.204504, 2.697231, 1.140094, 2.761565, 1.664405, 3.745449, 1.769345,
3.086663, 0.363775, 4.200883, 0.303491, 0.176866, 1.164081, 0.221766, 1.461359,
4.486595, 1.928898, 4.720233, 2.678347, 4.327723, 1.564121, 0.458690, 4.510347,
3.773936, 3.125306, 0.000000, 4.665915, 1.615753, 2.138209, 4.072597, 2.630236,
0.960803, 1.703519, 4.052649, 0.229570, 1.275317, 2.691225, 4.400862, 0.127109,
2.132822, 3.353690, 4.410775, 4.997817, 0.638831, 1.094744, 4.437918, 1.307354,
1.862491, 0.806982, 1.578747, 0.439098,
],
[
1.034444, 1.680238, 2.624086, 4.074075, 2.403151, 2.955012, 0.212641, 0.813129,
3.904602, 4.560897, 1.011310, 3.714317, 3.658584, 1.757408, 4.781940, 2.025130,
2.717000, 4.559715, 2.295695, 4.497427, 0.910631, 2.432823, 2.463753, 0.309807,
0.305670, 4.582223, 4.826534, 0.816918, 2.023261, 1.850197, 1.849903, 2.864078,
4.162937, 0.122239, 4.665915, 0.000000, 0.699465, 4.810238, 4.444531, 4.586934,
2.799036, 0.995222, 0.418634, 1.837307, 0.768094, 4.684147, 1.439875, 3.380646,
1.239109, 2.523024, 1.068445, 4.412711, 4.097086, 3.038648, 3.177308, 1.179489,
3.516503, 3.775970, 0.738513, 0.330638,
],
[
2.251762, 0.906505, 1.501364, 3.577571, 4.206135, 2.818509, 3.835264, 0.904281,
4.237559, 1.139407, 0.307760, 4.193920, 2.058769, 4.897998, 1.352527, 4.418721,
4.880682, 4.021074, 4.128096, 0.428392, 3.293299, 3.610845, 1.821601, 1.263633,
2.930469, 0.422036, 3.828421, 4.480986, 4.790335, 4.361629, 4.724786, 4.968010,
4.124551, 3.310336, 1.615753, 0.699465, 0.000000, 0.156261, 4.387825, 4.849109,
1.837937, 4.996093, 2.892543, 0.443199, 4.396954, 0.181390, 1.079796, 4.074065,
0.671327, 2.802999, 2.368098, 3.246777, 1.514723, 0.644272, 3.664502, 2.654808,
0.340500, 2.029693, 0.074411, 4.013317,
],
[
0.713795, 0.586338, 4.110375, 1.580541, 2.740628, 4.862907, 4.778285, 0.786780,
4.270392, 4.178353, 2.866716, 0.605992, 4.148160, 2.213667, 2.751882, 0.338191,
0.488696, 4.167764, 1.468050, 4.698445, 1.340322, 1.086459, 1.444167, 1.200063,
1.888943, 4.908243, 1.576075, 1.848047, 1.261011, 0.471950, 3.940023, 0.056396,
4.841591, 4.101388, 2.138209, 4.810238, 0.156261, 0.000000, 4.499784, 2.005096,
1.843242, 3.705328, 4.670639, 4.361788, 4.411306, 3.553442, 0.316715, 2.133372,
3.280661, 1.131752, 4.797406, 4.428901, 1.133545, 1.207314, 4.238935, 4.874612,
0.757060, 2.596284, 0.506461, 4.756342,
],
[
4.588093, 4.384408, 4.402477, 4.517454, 4.791373, 4.407127, 2.764424, 2.412784,
0.189642, 0.755591, 0.570511, 0.108039, 4.306776, 0.594128, 2.033222, 1.924321,
0.479074, 0.107861, 4.440827, 4.138015, 0.313934, 1.097094, 3.108348, 2.573067,
2.401067, 1.977814, 4.497419, 4.485308, 3.605977, 1.849619, 2.352938, 4.534493,
2.029159, 4.854271, 4.072597, 4.444531, 4.387825, 4.499784, 0.000000, 0.966278,
4.375428, 3.543331, 4.379449, 4.166464, 4.111150, 4.289129, 1.153777, 1.157209,
1.114083, 4.033241, 2.473727, 1.657701, 3.636295, 0.638619, 4.747015, 0.476737,
0.550361, 0.553922, 1.420690, 0.866312,
],
[
0.903526, 3.367245, 3.157938, 1.830547, 1.185806, 4.713721, 0.981083, 1.095174,
1.394876, 3.642142, 3.274720, 4.092828, 2.411632, 4.518446, 2.132772, 3.051278,
1.411892, 2.735377, 0.424388, 2.565248, 4.215844, 1.289625, 0.095880, 4.750709,
3.948287, 4.271546, 0.667558, 4.127299, 4.303034, 3.636584, 4.109080, 4.725493,
1.984858, 3.310110, 2.630236, 4.586934, 4.849109, 2.005096, 0.966278, 0.000000,
2.968621, 4.842447, 0.638352, 1.317179, 0.729053, 0.528125, 0.825998, 4.591024,
4.427640, 4.981077, 4.352080, 0.403300, 1.040559, 1.750528, 4.010317, 2.051620,
1.014350, 1.399032, 4.189746, 4.290765,
],
[
2.326940, 1.317817, 3.633570, 4.093379, 4.610500, 0.143158, 2.080282, 3.470370,
1.436553, 0.409059, 0.106117, 4.962971, 2.507276, 2.096392, 2.837784, 4.568040,
0.972421, 4.712775, 4.807090, 1.294092, 1.257870, 4.035828, 1.705553, 4.833637,
4.988185, 1.935197, 0.633619, 0.305510, 4.447787, 2.165899, 4.500273, 0.469394,
0.219099, 4.323796, 0.960803, 2.799036, 1.837937, 1.843242, 4.375428, 2.968621,
0.000000, 1.975262, 2.300563, 0.867163, 0.204035, 4.461097, 0.565436, 2.564119,
3.266687, 4.751240, 4.751115, 2.801173, 1.982532, 0.435353, 4.639316, 3.436719,
0.746642, 0.156496, 4.971162, 4.686265,
],
[
3.508279, 2.226252, 4.416333, 2.026925, 1.130764, 3.937372, 4.468903, 3.623356,
2.125902, 0.723546, 4.750535, 1.709613, 0.446191, 0.753630, 3.533584, 1.916192,
4.183452, 0.812606, 2.183026, 2.087325, 2.607760, 4.462096, 4.839312, 3.964780,
1.509160, 0.711004, 3.028421, 4.269121, 0.771105, 4.854558, 4.720473, 2.215421,
1.363012, 0.441802, 1.703519, 0.995222, 4.996093, 3.705328, 3.543331, 4.842447,
1.975262, 0.000000, 4.125850, 0.147120, 3.955324, 1.722012, 4.449436, 1.228221,
1.160650, 4.207028, 3.905398, 3.922468, 3.320063, 3.194319, 4.631611, 0.794828,
4.390828, 3.923844, 0.391918, 1.499470,
],
[
2.708999, 0.117932, 4.385257, 2.985296, 3.445353, 0.503919, 2.071777, 2.179669,
4.008005, 4.564132, 0.235723, 2.668719, 4.888921, 1.985625, 1.095731, 4.208334,
0.951588, 0.496545, 3.293705, 0.767276, 1.205704, 2.539085, 4.095879, 4.540156,
3.018114, 0.337048, 0.981903, 0.953616, 1.548090, 3.961720, 4.162081, 3.734412,
3.286959, 2.118376, 4.052649, 0.418634, 2.892543, 4.670639, 4.379449, 0.638352,
2.300563, 4.125850, 0.000000, 1.681982, 0.407831, 0.537775, 1.160862, 1.688168,
4.898233, 0.846497, 1.379398, 2.618901, 1.167035, 2.921410, 1.631917, 2.057443,
0.314705, 0.257282, 4.330946, 4.521046,
],
[
3.692747, 1.926906, 2.555327, 2.271655, 1.433267, 1.041033, 4.047362, 0.203090,
2.029780, 2.775090, 4.924640, 4.008243, 1.592434, 0.611881, 1.618817, 2.101981,
3.268824, 3.522216, 0.845245, 0.721767, 2.175595, 4.844996, 1.508773, 3.930465,
3.882922, 2.442162, 4.996224, 2.739465, 0.272590, 3.788388, 2.404698, 0.382779,
4.944757, 1.302228, 0.229570, 1.837307, 0.443199, 4.361788, 4.166464, 1.317179,
0.867163, 0.147120, 1.681982, 0.000000, 4.894795, 1.771976, 3.235593, 4.087507,
4.853264, 4.500336, 0.236180, 4.796411, 3.413289, 1.703965, 4.531223, 1.450305,
4.744009, 1.566827, 4.899957, 1.834386,
],
[
2.442325, 3.984944, 1.526944, 4.391410, 2.392641, 1.489056, 4.638121, 3.987409,
4.098334, 1.043625, 1.423819, 2.293551, 4.961916, 4.614888, 1.444635, 3.149269,
4.207326, 3.069419, 0.243512, 0.379287, 3.195266, 3.519934, 3.372096, 0.760055,
1.977537, 4.141926, 4.839184, 1.709889, 3.815996, 4.706004, 0.265941, 3.245291,
1.030732, 1.121309, 1.275317, 0.768094, 4.396954, 4.411306, 4.111150, 0.729053,
0.204035, 3.955324, 0.407831, 4.894795, 0.000000, 4.655854, 0.460428, 3.743793,
4.191156, 0.724857, 1.307860, 4.994467, 2.550654, 1.630953, 0.543876, 1.611427,
0.651284, 2.370741, 1.768422, 0.811823,
],
[
1.334051, 2.900305, 4.283946, 4.347800, 4.190796, 4.321681, 1.582934, 0.831070,
1.069718, 1.155197, 1.501602, 0.632796, 3.159384, 1.733535, 1.497457, 0.244091,
1.760816, 1.379934, 1.852508, 0.932444, 2.575460, 1.782647, 0.884391, 4.676833,
4.312808, 0.341517, 1.175581, 4.232529, 2.278565, 4.834473, 4.107265, 4.484100,
3.947551, 4.722457, 2.691225, 4.684147, 0.181390, 3.553442, 4.289129, 0.528125,
4.461097, 1.722012, 0.537775, 1.771976, 4.655854, 0.000000, 2.979612, 1.064547,
4.073481, 0.357330, 3.809975, 4.501581, 2.107451, 4.442884, 3.466302, 1.841047,
0.371387, 2.826812, 1.435931, 1.327873,
],
[
0.459576, 0.663992, 2.938336, 2.081290, 3.378379, 4.233458, 3.598245, 1.292416,
4.784356, 4.052703, 4.084645, 1.140646, 3.171336, 4.230987, 4.514280, 2.829055,
4.478642, 0.382188, 0.098084, 1.402163, 0.113105, 0.111577, 2.850759, 3.298376,
1.474196, 0.474990, 0.887586, 0.252833, 4.708893, 3.111274, 3.198222, 1.051898,
3.950365, 4.307813, 4.400862, 1.439875, 1.079796, 0.316715, 1.153777, 0.825998,
0.565436, 4.449436, 1.160862, 3.235593, 0.460428, 2.979612, 0.000000, 1.344498,
1.239031, 1.409137, 0.653470, 0.600596, 1.452662, 4.729976, 0.916310, 0.434106,
4.889744, 0.390807, 0.451306, 2.469303,
],
[
3.946710, 2.577775, 1.310284, 4.249434, 2.597828, 4.509882, 3.588702, 1.590231,
3.411624, 3.378091, 0.683678, 1.016851, 2.005230, 0.241260, 0.466712, 0.917814,
1.884502, 4.899893, 0.809933, 4.504372, 4.241622, 3.522354, 1.844890, 2.560888,
3.227681, 4.537781, 0.094959, 1.415504, 3.021307, 2.499110, 3.978971, 4.503131,
0.410266, 4.765479, 0.127109, 3.380646, 4.074065, 2.133372, 1.157209, 4.591024,
2.564119, 1.228221, 1.688168, 4.087507, 3.743793, 1.064547, 1.344498, 0.000000,
0.139813, 1.179831, 0.124413, 0.445097, 2.963913, 0.277198, 2.071030, 3.409774,
4.809545, 3.102920, 4.376583, 0.710130,
],
[
0.055267, 0.406883, 0.309163, 4.279881, 2.968496, 4.008125, 1.010528, 1.669681,
4.583627, 0.340980, 1.438319, 3.505270, 4.753832, 3.861298, 1.696782, 2.406452,
4.209374, 2.850354, 2.593562, 0.068886, 0.118432, 2.618223, 4.743290, 0.331088,
4.163928, 1.804096, 1.325515, 2.410875, 0.953014, 3.116941, 1.694417, 0.567336,
2.523034, 4.266994, 2.132822, 1.239109, 0.671327, 3.280661, 1.114083, 4.427640,
3.266687, 1.160650, 4.898233, 4.853264, 4.191156, 4.073481, 1.239031, 0.139813,
0.000000, 4.592666, 0.777960, 1.219546, 1.606824, 3.056944, 0.787450, 1.350019,
1.025081, 2.087585, 1.091075, 2.946396,
],
[
1.099751, 0.412122, 1.915014, 0.717072, 0.107686, 4.159782, 4.890805, 0.153875,
4.232934, 4.456815, 1.505305, 0.289254, 3.297696, 1.431282, 0.621041, 3.015704,
4.215803, 1.972511, 0.776147, 3.043028, 0.429566, 2.275219, 4.336064, 1.419930,
2.308317, 1.638243, 2.481982, 2.062289, 0.587429, 0.439488, 2.732042, 0.467920,
0.348420, 4.895035, 3.353690, 2.523024, 2.802999, 1.131752, 4.033241, 4.981077,
4.751240, 4.207028, 0.846497, 4.500336, 0.724857, 0.357330, 1.409137, 1.179831,
4.592666, 0.000000, 4.488001, 1.383202, 4.814965, 4.709711, 1.091081, 3.189067,
0.564603, 2.622082, 2.328134, 3.732336,
],
[
2.925335, 0.831479, 4.897499, 1.118912, 4.346556, 2.562929, 4.741790, 0.548170,
3.886021, 0.343358, 2.517258, 2.631256, 1.148607, 0.130153, 1.731986, 2.365464,
3.099656, 0.655705, 0.983649, 1.559434, 0.742375, 3.383382, 2.124696, 1.581828,
2.446477, 4.883098, 4.350843, 4.795676, 1.478402, 4.900626, 2.469950, 4.738365,
0.771401, 4.481559, 4.410775, 1.068445, 2.368098, 4.797406, 2.473727, 4.352080,
4.751115, 3.905398, 1.379398, 0.236180, 1.307860, 3.809975, 0.653470, 0.124413,
0.777960, 4.488001, 0.000000, 1.046174, 3.476742, 1.191075, 1.441048, 4.163942,
1.907558, 0.883853, 4.807069, 4.372720,
],
[
0.773581, 1.228093, 2.988141, 2.369764, 4.733188, 3.025159, 0.274934, 4.145180,
4.397545, 4.825289, 0.725606, 3.076811, 2.202134, 2.274196, 4.202123, 4.071206,
0.566342, 3.355536, 3.422190, 0.188675, 2.698247, 1.258855, 0.486662, 4.775650,
4.737423, 4.124259, 3.926477, 1.642594, 3.232977, 4.566134, 1.180479, 2.515232,
1.019689, 4.060477, 4.997817, 4.412711, 3.246777, 4.428901, 1.657701, 0.403300,
2.801173, 3.922468, 2.618901, 4.796411, 4.994467, 4.501581, 0.600596, 0.445097,
1.219546, 1.383202, 1.046174, 0.000000, 3.016162, 4.634109, 0.086710, 2.929043,
0.731324, 0.760206, 1.327265, 0.826288,
],
[
4.922572, 2.941276, 1.429985, 3.314291, 0.546419, 4.235115, 1.569044, 4.420659,
4.363117, 1.663977, 4.597704, 1.159531, 1.838661, 1.108174, 4.774702, 4.247362,
0.954567, 2.333178, 4.656068, 4.542273, 2.114605, 3.399761, 3.081171, 2.643864,
4.869605, 3.979884, 3.088951, 1.500409, 0.534395, 4.537229, 4.388522, 0.906205,
2.485043, 0.392090, 0.638831, 4.097086, 1.514723, 1.133545, 3.636295, 1.040559,
1.982532, 3.320063, 1.167035, 3.413289, 2.550654, 2.107451, 1.452662, 2.963913,
1.606824, 4.814965, 3.476742, 3.016162, 0.000000, 4.150430, 1.734782, 2.105403,
1.315300, 3.795247, 1.573085, 2.105321,
],
[
0.285106, 3.191453, 4.521935, 4.062715, 3.220235, 2.236781, 4.563202, 1.788853,
4.707714, 4.722111, 1.397665, 2.394972, 2.362478, 1.050060, 0.176741, 2.274374,
0.419357, 4.873020, 1.448925, 1.962907, 4.350465, 0.806508, 4.492930, 4.319733,
3.272142, 4.439688, 4.298731, 2.346367, 4.646580, 1.223784, 4.216999, 2.052476,
2.069265, 0.945692, 1.094744, 3.038648, 0.644272, 1.207314, 0.638619, 1.750528,
0.435353, 3.194319, 2.921410, 1.703965, 1.630953, 4.442884, 4.729976, 0.277198,
3.056944, 4.709711, 1.191075, 4.634109, 4.150430, 0.000000, 4.311600, 1.115831,
4.810831, 2.144732, 3.833321, 4.605267,
],
[
4.989232, 2.453570, 2.124790, 3.252461, 2.878050, 2.792522, 4.751001, 1.126261,
4.903547, 4.090922, 4.917615, 0.531590, 0.326633, 2.946871, 1.656622, 0.160935,
4.222121, 1.723763, 0.953593, 3.477127, 1.668767, 0.429422, 3.674428, 1.701672,
4.902668, 4.945456, 0.676756, 3.723118, 4.116693, 3.643570, 3.149773, 0.305531,
4.558173, 4.314302, 4.437918, 3.177308, 3.664502, 4.238935, 4.747015, 4.010317,
4.639316, 4.631611, 1.631917, 4.531223, 0.543876, 3.466302, 0.916310, 2.071030,
0.787450, 1.091081, 1.441048, 0.086710, 1.734782, 4.311600, 0.000000, 0.313366,
4.761962, 3.946888, 1.522849, 4.996505,
],
[
0.901800, 1.198007, 0.146247, 3.098200, 1.345837, 4.348121, 4.449936, 4.074307,
0.601168, 2.337065, 0.733094, 0.451326, 4.267924, 2.606455, 0.297967, 0.405840,
4.231904, 2.994384, 4.838919, 2.398568, 3.773346, 0.538735, 4.378221, 1.266722,
0.067218, 0.215156, 0.931481, 1.728922, 4.456970, 4.214771, 2.299486, 2.801889,
4.943771, 1.111926, 1.307354, 1.179489, 2.654808, 4.874612, 0.476737, 2.051620,
3.436719, 0.794828, 2.057443, 1.450305, 1.611427, 1.841047, 0.434106, 3.409774,
1.350019, 3.189067, 4.163942, 2.929043, 2.105403, 1.115831, 0.313366, 0.000000,
4.870443, 4.456883, 0.753663, 1.176804,
],
[
0.578703, 0.759868, 2.045570, 2.706090, 3.826796, 2.615496, 2.329713, 1.106938,
2.212727, 2.717105, 4.397241, 4.330926, 1.757100, 2.827577, 4.311971, 1.084919,
0.131027, 1.076928, 1.551026, 2.682934, 4.961482, 2.597726, 2.267963, 2.666077,
4.350487, 1.305596, 2.033594, 3.821680, 0.360820, 2.151247, 3.206198, 4.766303,
0.489457, 3.924826, 1.862491, 3.516503, 0.340500, 0.757060, 0.550361, 1.014350,
0.746642, 4.390828, 0.314705, 4.744009, 0.651284, 0.371387, 4.889744, 4.809545,
1.025081, 0.564603, 1.907558, 0.731324, 1.315300, 4.810831, 4.761962, 4.870443,
0.000000, 3.983720, 0.274514, 4.500714,
],
[
0.256764, 0.707636, 0.220002, 4.017126, 0.934179, 1.730010, 4.385684, 4.286948,
3.718491, 4.025017, 2.465136, 1.167943, 1.746484, 4.421694, 0.588142, 4.360359,
4.479700, 4.545864, 4.717634, 2.442238, 4.239940, 2.421938, 1.343625, 4.764264,
4.628898, 0.534130, 2.921946, 0.182378, 4.928525, 1.732594, 4.455393, 4.966281,
1.173462, 4.555940, 0.806982, 3.775970, 2.029693, 2.596284, 0.553922, 1.399032,
0.156496, 3.923844, 0.257282, 1.566827, 2.370741, 2.826812, 0.390807, 3.102920,
2.087585, 2.622082, 0.883853, 0.760206, 3.795247, 2.144732, 3.946888, 4.456883,
3.983720, 0.000000, 1.610700, 0.976326,
],
[
3.590394, 0.165043, 0.655630, 4.747971, 0.112900, 4.089230, 2.927723, 4.195746,
0.425954, 4.724229, 2.253319, 3.243198, 0.062832, 4.461098, 1.916189, 0.442129,
4.829501, 1.395865, 0.188810, 0.735822, 4.618262, 3.949061, 0.865750, 1.678684,
2.701745, 4.887971, 1.490809, 4.233347, 0.736670, 1.296173, 4.700482, 0.558089,
2.513525, 4.675767, 1.578747, 0.738513, 0.074411, 0.506461, 1.420690, 4.189746,
4.971162, 0.391918, 4.330946, 4.899957, 1.768422, 1.435931, 0.451306, 4.376583,
1.091075, 2.328134, 4.807069, 1.327265, 1.573085, 3.833321, 1.522849, 0.753663,
0.274514, 1.610700, 0.000000, 2.493776,
],
[
2.761763, 4.053320, 2.510744, 4.264483, 2.976834, 2.045845, 0.592037, 2.189509,
4.114706, 3.050787, 1.788120, 2.654404, 2.483689, 4.537366, 4.524938, 0.963368,
2.481917, 4.773448, 1.513570, 4.190199, 3.000183, 1.195810, 3.199708, 0.899362,
3.265586, 1.710436, 2.927134, 2.442918, 4.506546, 4.873501, 4.705313, 4.698479,
0.813032, 0.764524, 0.439098, 0.330638, 4.013317, 4.756342, 0.866312, 4.290765,
4.686265, 1.499470, 4.521046, 1.834386, 0.811823, 1.327873, 2.469303, 0.710130,
2.946396, 3.732336, 4.372720, 0.826288, 2.105321, 4.605267, 4.996505, 1.176804,
4.500714, 0.976326, 2.493776, 0.000000,
],
]);
let ord = vec![
0, 1, 19, 46, 7, 8, 52, 11, 9, 38, 60, 25, 34, 53, 12, 37, 2, 30, 43, 32, 39, 10, 24,
14, 4, 5, 16, 28, 15, 18, 40, 41, 23, 56, 27, 29, 21, 58, 54, 35, 22, 13, 51, 45, 50,
55, 48, 3, 31, 57, 59, 33, 47, 49, 36, 44, 26, 42, 6, 20, 17,
];
let (splits, _stats) = compute_splits(&ord, &d).expect("splitstree4 weights");
let weights: Vec<f64> = splits.iter().map(|s| s.weight).collect();
let expected = vec![
0.16598187065561426,
0.3413285766156679,
0.5143327365881223,
0.04150232963583798,
0.6486380696587152,
0.004327160561123797,
0.44948364296182375,
0.7037762152807022,
0.007235156398797245,
1.0595974087192954,
0.15843955018571165,
0.979292446408662,
0.07920841256675976,
0.008568761499042912,
0.0141619556862731,
1.53804757165651,
1.1646649789157482,
0.0750559427157212,
0.6763087565580593,
0.669856636394683,
0.8554442856008433,
0.02679352912644726,
0.12479377059321302,
1.0383275989133525,
0.02887396186678776,
0.30439517659608173,
0.5716824495146474,
1.048757579130202,
0.2923458267184822,
0.5327136593851844,
0.017018098705770274,
0.030623650657410597,
0.03661059028837523,
0.8863069226002059,
1.0106955649995175,
0.9443294289655639,
0.2628880981898747,
0.35018876907656643,
0.8181061610269249,
0.4795835226792496,
1.030764284944774,
1.0257285456651044,
0.5527828724700371,
0.841817879004116,
0.6573979253923941,
0.024463323835069682,
0.47229521685114895,
0.037294438457005,
0.6699952880293244,
0.5102392927228439,
1.3229928324018017,
0.0340876029461542,
0.12208557661108145,
0.862993717974222,
0.39095085011978736,
0.774284666749597,
0.6812212189461794,
0.22763825633815998,
0.5835756473334931,
0.6282286635694793,
0.11301989387040465,
1.0488595967525471,
0.0013990402772539145,
0.08611658185957673,
0.09202751800677184,
0.8200370233475135,
0.2927403386679698,
0.4944074055340997,
0.5413409875149421,
0.21351631156212858,
0.5595404948568735,
0.5151400592836067,
0.6020981408819639,
0.024238909699830797,
0.4520418798530698,
0.06442968765499696,
0.7019444410149676,
0.02375809107476607,
0.09332880464566293,
0.14741554759256606,
0.5180351715574494,
0.07620242137035763,
0.5389243096324757,
0.23308837379501146,
0.7407415331771038,
1.6147627697782234,
0.17515416445114576,
0.5529728213775793,
0.3031616146430265,
0.0917336119092074,
0.8351359742132873,
0.4744824186079424,
0.005794739579281382,
0.2737850551958593,
0.26871570657259,
0.3557148727191403,
0.0666388894555996,
0.4365861594786245,
0.038823674517646935,
0.41332335130835823,
0.3829869524967885,
0.29104618831106766,
0.6088475288930207,
0.4318351251553341,
1.2583855243679163,
0.486800846602703,
0.6400082582087963,
0.3904783648101349,
];
compare_float_array(&weights, &expected, 1e-6);
}
}