View Javadoc
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 }