fast-nnt 0.2.4

Rust implementation of the SplitsTree NeighborNet algorithm.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
use anyhow::Result;
use fixedbitset::FixedBitSet;
use ndarray::Array2;

use crate::splits::asplit::ASplit;

pub const DEFAULT_CUTOFF: f64 = 1e-6;

#[derive(Clone, Copy, Debug)]
enum Variance {
    Ols,
    #[allow(dead_code)]
    Fm1,
    #[allow(dead_code)]
    Fm2,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Regularization {
    Nnls,
    #[allow(dead_code)]
    Lasso,
    #[allow(dead_code)]
    NormLasso,
    #[allow(dead_code)]
    InternalLasso,
}

#[derive(Clone, Copy, Debug)]
struct Splitstree4Options {
    variance: Variance,
    cutoff: f64,
    regularization: Regularization,
    lambda_fraction: f64,
}

impl Default for Splitstree4Options {
    fn default() -> Self {
        Self {
            variance: Variance::Ols,
            cutoff: DEFAULT_CUTOFF,
            regularization: Regularization::Nnls,
            lambda_fraction: 1.0,
        }
    }
}

/// Compute split weights using the SplitsTree4-style optimizer used in SplitsTree6.
/// `cycle` is 1-based with leading 0 sentinel.
pub fn compute_splits(cycle: &[usize], distances: &Array2<f64>) -> Result<Vec<ASplit>> {
    compute_weighted_splits(cycle, distances, Splitstree4Options::default())
}

fn compute_weighted_splits(
    cycle: &[usize],
    distances: &Array2<f64>,
    options: Splitstree4Options,
) -> Result<Vec<ASplit>> {
    let n = cycle.len().saturating_sub(1);
    if n <= 1 {
        return Ok(Vec::new());
    }
    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)]);
        }
        return Ok(Vec::new());
    }

    let npairs = n * (n - 1) / 2;
    let d = setup_d(distances, cycle, n);
    let v = setup_v(distances, cycle, n, options.variance);

    let mut w = vec![0.0; npairs];
    for k in 0..npairs {
        if v[k] == 0.0 {
            w[k] = 1.0e11;
        } else {
            w[k] = 1.0 / v[k];
        }
    }

    let mut x = vec![0.0; npairs];
    run_active_conjugate(n, &d, &w, &mut x, options);

    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)
}

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 setup_v(distances: &Array2<f64>, cycle: &[usize], n: usize, variance: Variance) -> Vec<f64> {
    let mut v = vec![0.0; n * (n - 1) / 2];
    let mut index = 0usize;
    for i in 0..n {
        for j in (i + 1)..n {
            let dij = distances[[cycle[i + 1] - 1, cycle[j + 1] - 1]];
            v[index] = match variance {
                Variance::Fm1 => dij,
                Variance::Fm2 => dij * dij,
                Variance::Ols => 1.0,
            };
            index += 1;
        }
    }
    v
}

fn run_active_conjugate(n: usize, d: &[f64], w: &[f64], x: &mut [f64], options: Splitstree4Options) {
    let collapse_many_negs = true;
    let npairs = d.len();
    if w.len() != npairs || x.len() != npairs {
        panic!("Vectors d,W,x have different dimensions");
    }

    run_unconstrained_ls(n, d, x);
    if x.iter().all(|&val| val >= 0.0) {
        return;
    }

    let mut r = vec![0.0; npairs];
    let mut wtmp = vec![0.0; npairs];
    let mut p = vec![0.0; npairs];
    let mut y = vec![0.0; npairs];
    let mut old_x = vec![1.0; npairs];

    let mut active = vec![false; npairs];
    let fixed_active = vec![false; npairs];
    let mut atwd = vec![0.0; npairs];
    for k in 0..npairs {
        y[k] = w[k] * d[k];
    }
    calculate_atx(n, &y, &mut atwd);

    if options.regularization != Regularization::Nnls {
        let mut max_atwd = 0.0;
        for &val in &atwd {
            if val > max_atwd {
                max_atwd = val;
            }
        }
        let lambda = max_atwd * (1.0 - options.lambda_fraction);
        for k in 0..npairs {
            atwd[k] -= lambda;
        }
    }

    let mut first_pass = true;
    loop {
        loop {
            if !first_pass {
                circular_conjugate_grads(n, npairs, &mut r, &mut wtmp, &mut p, &mut y, w, &atwd, &active, x);
            }
            first_pass = false;

            if collapse_many_negs {
                if let Some(entries) = worst_indices(x, 0.6) {
                    for &idx in &entries {
                        x[idx] = 0.0;
                        active[idx] = true;
                    }
                    circular_conjugate_grads(
                        n, npairs, &mut r, &mut wtmp, &mut p, &mut y, w, &atwd, &active, x,
                    );
                }
            }

            let mut min_i: Option<usize> = None;
            let mut min_xi = -1.0_f64;
            for i in 0..npairs {
                if x[i] < 0.0 {
                    let xi = old_x[i] / (old_x[i] - x[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 0..npairs {
                    if !active[i] {
                        old_x[i] += min_xi * (x[i] - old_x[i]);
                    }
                }
                let min_i = min_i.unwrap();
                active[min_i] = true;
                x[min_i] = 0.0;
            }
        }

        calculate_ab(n, x, &mut y);
        for i in 0..npairs {
            y[i] *= w[i];
        }
        calculate_atx(n, &y, &mut r);

        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 {
            return;
        } else {
            active[min_i.unwrap()] = false;
        }
    }
}

fn worst_indices(x: &[f64], prop_kept: f64) -> Option<Vec<usize>> {
    if prop_kept == 0.0 {
        return None;
    }

    let num_neg = x.iter().filter(|&&v| v < 0.0).count();
    if num_neg == 0 {
        return None;
    }

    let mut xcopy: Vec<f64> = x.iter().copied().filter(|v| *v < 0.0).collect();
    xcopy.sort_by(|a, b| a.partial_cmp(b).unwrap());

    let nkept = ((prop_kept * num_neg as f64).ceil() as usize).max(1);
    let cutoff = xcopy[nkept - 1];

    let mut result = vec![0usize; nkept];
    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;
            }
        }
    }
    Some(result)
}

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 rowsum(n: usize, d: &[f64], k: usize) -> f64 {
    let mut r = 0.0;
    let mut index = 0usize;

    if k > 0 {
        index = k - 1;
        for i in 0..k {
            r += d[index];
            index += n - i - 2;
        }
        index += 1;
    }
    for _j in (k + 1)..n {
        r += d[index];
        index += 1;
    }
    r
}

fn calculate_atx(n: usize, d: &[f64], p: &mut [f64]) {
    let mut index = 0usize;
    for i in 0..n - 1 {
        p[index] = rowsum(n, d, i + 1);
        index += n - i - 1;
    }

    index = 1;
    for i in 0..n - 2 {
        p[index] = p[index - 1] + p[index + (n - i - 2)] - 2.0 * d[index + (n - i - 2)];
        index += (n - i - 2) + 1;
    }

    for k in 3..=n - 1 {
        index = k - 1;
        for i in 0..=n - k - 1 {
            p[index] = p[index - 1] + p[index + n - i - 2] - p[index + n - i - 3]
                - 2.0 * d[index + n - i - 2];
            index += (n - i - 2) + 1;
        }
    }
}

fn calculate_ab(n: usize, b: &[f64], d: &mut [f64]) {
    let mut dindex = 0usize;

    for i in 0..=n - 2 {
        let mut d_ij = 0.0;
        let mut index = i as isize - 1;
        if i > 0 {
            for k in 0..=i - 1 {
                d_ij += b[index as usize];
                index += (n - k - 2) as isize;
            }
        }
        index += 1;
        for _k in (i + 1)..=n - 1 {
            d_ij += b[index as usize];
            index += 1;
        }
        d[dindex] = d_ij;
        dindex += (n - i - 2) + 1;
    }

    let mut index = 1usize;
    for i in 0..=n - 3 {
        d[index] = d[index - 1] + d[index + (n - i - 2)] - 2.0 * b[index - 1];
        index += 1 + (n - i - 2);
    }

    for k in 3..=n - 1 {
        index = k - 1;
        for i in 0..=n - k - 1 {
            d[index] = d[index - 1] + d[index + (n - i - 2)] - d[index + (n - i - 2) - 1]
                - 2.0 * b[index - 1];
            index += 1 + (n - i - 2);
        }
    }
}

fn norm(x: &[f64]) -> f64 {
    x.iter().map(|v| v * v).sum()
}

fn circular_conjugate_grads(
    n: usize,
    npairs: usize,
    r: &mut [f64],
    w: &mut [f64],
    p: &mut [f64],
    y: &mut [f64],
    weights: &[f64],
    b: &[f64],
    active: &[bool],
    x: &mut [f64],
) {
    let kmax = n * (n - 1) / 2;

    calculate_ab(n, x, y);
    for k in 0..npairs {
        y[k] = weights[k] * y[k];
    }
    calculate_atx(n, y, r);

    for k in 0..npairs {
        if !active[k] {
            r[k] = b[k] - r[k];
        } else {
            r[k] = 0.0;
        }
    }

    let mut rho = norm(r);
    let mut rho_old = 0.0;

    let e0 = 0.0001 * norm(b).sqrt();
    let mut k = 0usize;

    while rho > e0 * e0 && k < kmax {
        k += 1;
        if k == 1 {
            p.copy_from_slice(r);
        } else {
            let beta = rho / rho_old;
            for i in 0..npairs {
                p[i] = r[i] + beta * p[i];
            }
        }

        calculate_ab(n, p, y);
        for i in 0..npairs {
            y[i] *= weights[i];
        }
        calculate_atx(n, y, w);
        for i in 0..npairs {
            if active[i] {
                w[i] = 0.0;
            }
        }

        let mut alpha = 0.0;
        for i in 0..npairs {
            alpha += p[i] * w[i];
        }
        alpha = rho / alpha;

        for i in 0..npairs {
            x[i] += alpha * p[i];
            r[i] -= alpha * w[i];
        }
        rho_old = rho;
        rho = norm(r);
    }
}

#[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 = compute_splits(&cycle, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        // Expected weights from splitstree6/examples/programs/splitstree4/colors.nex.
        let expected = vec![
            5.4911933, 13.998482, 3.5481272, 7.462752, 11.928696, 8.146091, 3.374955, 0.974247,
            6.045535, 4.9808993, 5.0014324, 6.0117188, 7.0219626, 7.53659, 11.402673, 4.512541,
            3.0345206, 2.9938161, 1.000118, 4.9945664, 5.4776573, 8.979996, 6.5275626, 5.014319,
            6.4802, 3.4943144, 4.1143675, 0.92449677, 6.4364915, 5.52085, 2.0923293, 3.1699855,
            3.2810664, 6.3298583, 4.500557, 0.70038056, 3.2450821, 2.971226, 5.544069, 6.19452,
            4.392257,
        ];

        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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        // Expected weights from splitstree6 (SplitsTree4 inference).
        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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        // Expected weights from splitstree6 (SplitsTree4 inference).
        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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        let expected = vec![
            0.35165982425650594,
            0.3234546583931394,
            0.01836248401040788,
            0.2647265910837152,
            0.07310658534257446,
            0.016904875835296145,
            0.07417425005162112,
            0.35058100474882176,
            0.4441751198741078,
            0.015184289560948135,
            0.14417596025830046,
            0.046011456403201235,
            0.6336355783886727,
            0.20310642722609853,
            0.004162330659955962,
            0.06720735623079344,
            0.03704912530132936,
            0.1595697392800101,
            0.030022700496515484,
            0.11530941384503693,
            0.22683290921085908,
            0.394777306803736,
            0.16004092378760623,
            0.10401889376194877,
            0.2949787696536616,
            0.04450620244989633,
            0.10503097122733772,
            0.4591147438942216,
            0.12685560778742017,
            0.5150872565426827,
            0.0584694398706967,
            0.07356090612223444,
            0.2706045489762404,
            0.10711442441854849,
            0.1546430151080418,
            0.4021732242954021,
            0.06517336333344045,
            0.29044695639220924,
            0.13646622046620638,
            0.23848374626235996,
            0.3987617377495577,
            0.36239314807406264,
            0.1965107186688232,
            0.4611518861953915,
            0.003423817703855466,
            0.1215123381285013,
            0.03235275110418943,
            0.0227377326173718,
            0.86291252936969,
            0.04183595095200871,
            0.024407628112227523,
            0.42215860178445985,
            0.03349779671734015,
            0.36019732728983167,
            0.38036199591496206,
            0.4687480844806215,
            0.026393576718969528,
            0.020076208853283227,
            0.1896472124048113,
            0.8118066234487102,
            0.3152989647618973,
            0.37645807745007587,
            0.3619824720157831,
            0.35290690020374527,
            0.36851063177213594,
        ];
        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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        let expected = vec![
            0.08076939554366558,
            0.09196192952674577,
            0.6412645344839522,
            0.04307566611412746,
            0.2854729464266826,
            0.5423990441054838,
            0.13780431233688334,
            0.5083284550743282,
            0.0730262963742157,
            0.49713810429304195,
            0.18442206459114477,
            0.1850966616897076,
            0.2613084879459821,
            0.34936200838582143,
            0.4840721214072634,
            0.5894158661997081,
            0.67465113622116,
            0.12034832888584664,
            0.5060341949307406,
            0.5069844790981874,
            0.012605030770295587,
            0.050681723422355655,
            0.3622915357852383,
            0.020777781682646643,
            0.15515431947002284,
            1.148038941818489,
            1.241598194705995,
            1.3645426702899373,
            0.7788857923752571,
            0.5643895844664053,
            0.1129178703130792,
            0.9103749040598481,
            0.03303335880984695,
            0.15995325223839202,
            0.70425249141232,
            0.7868959914135616,
            1.4715740885168629,
            0.5097015344279996,
            0.2556048197319649,
            0.0626566350537263,
            0.2885869851317498,
            0.5314882437353866,
            0.07948448940659163,
            0.022812838489533735,
            0.02021562105577531,
            0.13443275988528258,
            0.0037451937811076455,
            0.11250985500477548,
            0.0078530983342462,
            0.005246234410653929,
            0.9763165237463685,
            0.7916192493878376,
            0.6528239253818102,
            0.31803564930906647,
            0.22935330059270995,
            0.947968743537164,
            0.4005256448768398,
            0.01882812374041131,
            0.3987078146959666,
            0.06300561024065568,
            0.1780229237111241,
            0.09276056302426924,
            0.09821532881580872,
            0.14798287694462098,
            0.06970665539609298,
            0.14830755653966565,
            0.883944844891757,
            0.02592695206592093,
            1.0748724698645733,
            0.927910963006758,
            0.8035060312908797,
            0.23913335009049547,
            0.008483126563641974,
            0.3597234813549078,
            0.5887178960007969,
            0.4163957149107643,
            0.3587124022451584,
            0.01182656765893028,
            0.2123255605022302,
            0.5876484114875793,
            0.285921624127171,
            0.026488473383138016,
            0.4736634994616926,
            0.1960921435142503,
            0.8186228866498901,
            1.1703338350654557,
            0.34098305179570143,
            0.5104832080980876,
            0.11004495100475137,
            0.6431996986017025,
            0.31748893813848494,
            0.832432128437931,
        ];
        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 = compute_splits(&ord, &d).expect("splitstree4 weights");
        let weights: Vec<f64> = splits.iter().map(|s| s.get_weight()).collect();

        let expected = vec![
            0.1455809050390075,
            0.3808690746742522,
            0.5278079169520665,
            0.6491630600222968,
            0.4417269101043125,
            0.7178092817084187,
            1.0619951604112507,
            0.18107972918062235,
            0.968381682676979,
            0.0829255466731851,
            0.007511416017019698,
            0.01675542767002438,
            1.4639691014305891,
            1.1627200487780829,
            0.06320156894327948,
            0.6507164019005683,
            0.6985865848545649,
            0.8633836676988172,
            0.1446548588309863,
            1.0634828150544675,
            0.32286197365224456,
            0.587145698287964,
            1.028914680757699,
            0.327829980784316,
            0.5145405266965496,
            0.03714097793962144,
            0.01355188042135622,
            0.919802139879279,
            1.0236625354279973,
            0.9461526455446042,
            0.26230148712435297,
            0.3644952218742551,
            0.8031731915574415,
            0.49388971654200625,
            1.0325647498193475,
            1.027534607276239,
            0.5094495505150111,
            0.8926706167832601,
            0.5838313452622462,
            0.6139175869694229,
            0.5235759847017202,
            0.678274518119737,
            1.30510630517537,
            0.0493373686591561,
            0.12650106517224408,
            0.8449360224928821,
            0.39205294658362333,
            0.7706113799270633,
            0.6775483399773523,
            0.18949904480738386,
            0.6195397106847892,
            0.5900972561816162,
            0.10703932626625681,
            1.0537642794304587,
            0.08026068784586045,
            0.09713082838211846,
            0.8228115285266064,
            0.292065540047878,
            0.4960809339875006,
            0.5419792414801619,
            0.21519477383575805,
            0.5608995813885701,
            0.5362423479280308,
            0.5901107698909178,
            0.006098089312752661,
            0.4676087937023396,
            0.09073533167865708,
            0.696277124002764,
            0.1232952945564658,
            0.13817602298899614,
            0.530872355256303,
            0.09263365694508946,
            0.5009490937604878,
            0.27523137502002865,
            0.7032434443661112,
            1.623599694749164,
            0.18913855295153462,
            0.5437734720473616,
            0.2962509113054437,
            0.10569261816153804,
            0.8385260265374245,
            0.4774088597652146,
            0.2735933700515403,
            0.30921557462918753,
            0.3224109880712793,
            0.5578152523798958,
            0.06742950960931915,
            0.6598167146734144,
            0.3346683136490216,
            0.3271036607962388,
            0.47545617618559544,
            1.2843114788539545,
            0.5089070884315208,
            0.6152343707804764,
            0.3593566263272074,
        ];
        compare_float_array(&weights, &expected, 1e-6);
    }
}