1 package baseCode.algorithm.learning.unsupervised.cluster;
2
3 import java.util.Collection;
4 import java.util.Vector;
5
6 import junit.framework.TestCase;
7 import baseCode.algorithm.learning.unsupervised.cluster.Cluster;
8 import baseCode.algorithm.learning.unsupervised.cluster.DistanceFactory;
9 import baseCode.algorithm.learning.unsupervised.cluster.Distancer;
10 import baseCode.algorithm.learning.unsupervised.cluster.HierarchicalClusterer;
11 import baseCode.common.Distanceable;
12 import cern.colt.list.ObjectArrayList;
13
14 /***
15 * <hr>
16 * <p>
17 * Copyright (c) 2004 Columbia University
18 *
19 * @author pavlidis
20 * @version $Id: HierarchicalClustererTest.java,v 1.1 2005/03/17 13:58:43 pavlidis Exp $
21 */
22 public class HierarchicalClustererTest extends TestCase {
23
24
25 HierarchicalClusterer foo;
26 ObjectArrayList testData;
27
28
29
30
31 protected void setUp() throws Exception {
32 super.setUp();
33 testData = new ObjectArrayList(new DoubleDistanceable[]{
34 new DoubleDistanceable(5),
35 new DoubleDistanceable(4),
36 new DoubleDistanceable(5),
37 new DoubleDistanceable(4),
38 new DoubleDistanceable(5),
39 new DoubleDistanceable(4),
40 new DoubleDistanceable(5),
41 new DoubleDistanceable(4),
42 new DoubleDistanceable(8),
43 new DoubleDistanceable(3),
44 new DoubleDistanceable(2),
45 new DoubleDistanceable(1)
46 });
47
48 foo = new HierarchicalClusterer(testData);
49 }
50
51 public void testRun() {
52 foo.run();
53 Cluster[] expectedResults = new Cluster[]{
54 new DoubleDistanceable(8),
55 new DoubleDistanceable(5),
56 new DoubleDistanceable(5),
57 new DoubleDistanceable(5),
58 new DoubleDistanceable(5),
59 new DoubleDistanceable(4),
60 new DoubleDistanceable(4),
61 new DoubleDistanceable(4),
62 new DoubleDistanceable(4),
63 new DoubleDistanceable(3),
64 new DoubleDistanceable(2),
65 new DoubleDistanceable(1)
66
67 };
68
69 DoubleDistanceable[] actualResults = ( DoubleDistanceable[] ) foo.getResults();
70
71 assertEquals(actualResults, expectedResults);
72 }
73
74 }
75
76
77 /*** helpers **
78
79 class DoubleDistanceable extends Cluster {
80
81 Double value;
82
83 /**
84 * @param value
85 */
86 public DoubleDistanceable( double value ) {
87 this.value = new Double(value);
88 Vector v = new Vector();
89 v.add(this.value);
90 this.items = v;
91 this.distAlg = new DoubleDifferenceFactory().getDistancer();
92 }
93
94 public static int compare( double d1, double d2 ) {
95 return Double.compare( d1, d2 );
96 }
97
98 public static long doubleToLongBits( double value ) {
99 return Double.doubleToLongBits( value );
100 }
101
102 public static long doubleToRawLongBits( double value ) {
103 return Double.doubleToRawLongBits( value );
104 }
105
106 public static boolean isInfinite( double v ) {
107 return Double.isInfinite( v );
108 }
109
110 public static boolean isNaN( double v ) {
111 return Double.isNaN( v );
112 }
113
114 public static double longBitsToDouble( long bits ) {
115 return Double.longBitsToDouble( bits );
116 }
117
118 public static double parseDouble( String s ) throws NumberFormatException {
119 return Double.parseDouble( s );
120 }
121
122 public static String toString( double d ) {
123 return Double.toString( d );
124 }
125
126 public static Double valueOf( String s ) throws NumberFormatException {
127 return Double.valueOf( s );
128 }
129
130 public byte byteValue() {
131 return value.byteValue();
132 }
133
134 public int compareTo( Double anotherDouble ) {
135 return value.compareTo( anotherDouble );
136 }
137
138 public int compareTo( Object o ) {
139 return value.compareTo( o );
140 }
141
142 public double doubleValue() {
143 return value.doubleValue();
144 }
145
146 public boolean equals( Object obj ) {
147 return value.equals( obj );
148 }
149
150 public float floatValue() {
151 return value.floatValue();
152 }
153
154 public int hashCode() {
155 return value.hashCode();
156 }
157
158 public int intValue() {
159 return value.intValue();
160 }
161
162 public boolean isInfinite() {
163 return value.isInfinite();
164 }
165
166 public boolean isNaN() {
167 return value.isNaN();
168 }
169
170 public long longValue() {
171 return value.longValue();
172 }
173
174 public short shortValue() {
175 return value.shortValue();
176 }
177
178 public String toString() {
179 return value.toString();
180 }
181
182
183
184
185
186 private boolean visited;
187
188 public boolean isVisited() {
189 return visited;
190 }
191
192
193
194
195 public void mark() {
196 visited = true;
197 }
198
199
200
201
202 public void unMark() {
203 visited = false;
204 }
205
206
207
208
209 public Collection toCollection() {
210 Collection ret = new Vector();
211 ret.add(this);
212 return ret;
213 }
214 }
215
216 class DoubleDifference implements Distancer {
217
218
219
220
221
222
223 public double distance( Distanceable a, Distanceable b ) {
224 DoubleDistanceable ad = ( DoubleDistanceable ) a;
225 DoubleDistanceable bd = ( DoubleDistanceable ) b;
226 return Math.abs( ad.value.doubleValue() - bd.value.doubleValue() );
227 }
228
229
230 }
231
232 class DoubleDifferenceFactory extends DistanceFactory {
233
234 private DoubleDifference d;
235
236 public DoubleDifferenceFactory() {
237 d = new DoubleDifference();
238 }
239
240 public Distancer getDistancer() {
241 return d;
242 }
243
244 }
245