1 // ******************************************************************************
2 //
3 // Title: Force Field X.
4 // Description: Force Field X - Software for Molecular Biophysics.
5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2025.
6 //
7 // This file is part of Force Field X.
8 //
9 // Force Field X is free software; you can redistribute it and/or modify it
10 // under the terms of the GNU General Public License version 3 as published by
11 // the Free Software Foundation.
12 //
13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 // details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple
20 // Place, Suite 330, Boston, MA 02111-1307 USA
21 //
22 // Linking this library statically or dynamically with other modules is making a
23 // combined work based on this library. Thus, the terms and conditions of the
24 // GNU General Public License cover the whole combination.
25 //
26 // As a special exception, the copyright holders of this library give you
27 // permission to link this library with independent modules to produce an
28 // executable, regardless of the license terms of these independent modules, and
29 // to copy and distribute the resulting executable under terms of your choice,
30 // provided that you also meet, for each linked independent module, the terms
31 // and conditions of the license of that module. An independent module is a
32 // module which is not derived from or based on this library. If you modify this
33 // library, you may extend this exception to your version of the library, but
34 // you are not obligated to do so. If you do not wish to do so, delete this
35 // exception statement from your version.
36 //
37 // ******************************************************************************
38
39 package ffx.numerics.clustering;
40
41 import ffx.utilities.FFXTest;
42 import org.junit.Test;
43
44 import java.util.Random;
45
46 import static java.lang.String.format;
47 import static org.junit.Assert.assertArrayEquals;
48 import static org.junit.Assert.assertEquals;
49
50 public class ClusterPerfTest extends FFXTest {
51
52 Cluster randomCluster(int n) {
53 ClusteringAlgorithm alg = new DefaultClusteringAlgorithm();
54
55 return alg.performClustering(randomDataDist(n), randomDataNames(n),
56 new AverageLinkageStrategy());
57 }
58
59 private double[][] randomDataDist(int n) {
60 Random rnd = new Random();
61 double[][] mat = new double[n][n];
62 for (int i = 0; i < n; i++) {
63 mat[i][i] = 0;
64 for (int j = i + 1; j < n; j++) {
65 double r = Math.floor(rnd.nextDouble() * 100) * 0.1;
66 mat[i][j] = r;
67 mat[j][i] = r;
68 }
69 }
70
71 return mat;
72 }
73
74 private String[] randomDataNames(int n) {
75 String[] ret = new String[n];
76 for (int i = 0; i < n; i++) {
77 ret[i] = "" + i;
78 }
79 return ret;
80 }
81
82 @Test
83 public void testRandomDataDist() throws Exception {
84 double[][] dist = randomDataDist(4);
85 assertEquals(dist.length, 4);
86 }
87
88 @Test
89 public void testRandomDataNames() {
90 String[] names = randomDataNames(4);
91 assertEquals(names.length, 4);
92 String[] exp = {"0", "1", "2", "3"};
93 assertArrayEquals(names, exp);
94 }
95
96 private Long timeN(int n) {
97 Long t0 = System.currentTimeMillis();
98 Cluster cluster = randomCluster(n);
99 return System.currentTimeMillis() - t0;
100 }
101
102 @Test
103 public void testn() {
104 for (int n = 1; n <= 1024; n = n * 2) {
105 Long t = timeN(n);
106 logger.info(format("%3d nodes -> %5d ms", n, t));
107 }
108 }
109 }