1 cananian 1.3.2.4 // Partition.java, created Mon Nov 16 23:33:21 1998 by mfoltz 2 cananian 1.3.2.4 // Copyright (C) 1998 Mark A. Foltz <mfoltz@ai.mit.edu> 3 cananian 1.3.2.4 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.3.2.4 5 mfoltz 1.1 // -*-Mode: Java-*- 6 mfoltz 1.1 // Partition.java -- 7 mfoltz 1.1 // Author: Mark Foltz <mfoltz@ai.mit.edu> 8 mfoltz 1.1 // Maintainer: Mark Foltz <mfoltz@ai.mit.edu> 9 mfoltz 1.1 // Version: 10 mfoltz 1.1 // Created: <Fri Oct 23 00:24:17 1998> 11 mfoltz 1.4 // Time-stamp: <1998-11-26 11:47:57 mfoltz> 12 mfoltz 1.1 // Keywords: 13 mfoltz 1.1 14 mfoltz 1.2 package harpoon.Analysis.Partition; 15 mfoltz 1.1 16 mfoltz 1.1 import java.util.Enumeration; 17 mfoltz 1.1 import java.util.Vector; 18 mfoltz 1.1 19 mfoltz 1.1 /** 20 mfoltz 1.1 * 21 mfoltz 1.1 * @author Mark A. Foltz <mfoltz@ai.mit.edu> 22 cananian 1.5 * @version $Id: Partition.java,v 1.5 2002/02/25 20:58:28 cananian Exp $ 23 mfoltz 1.1 */ 24 mfoltz 1.1 25 mfoltz 1.1 public class Partition { 26 mfoltz 1.1 27 mfoltz 1.1 public static void initialPartition(WeightedGraph g, int k, WeightedGraph p[]) { 28 mfoltz 1.1 29 mfoltz 1.1 Enumeration nodes; 30 mfoltz 1.1 WGNode node; 31 mfoltz 1.1 32 mfoltz 1.1 p[0] = new WeightedGraph(); 33 mfoltz 1.1 p[1] = new WeightedGraph(); 34 mfoltz 1.4 35 mfoltz 1.4 nodes = g.getNodes(); 36 mfoltz 1.4 while (nodes.hasMoreElements()) { 37 mfoltz 1.4 node = (WGNode) nodes.nextElement(); 38 mfoltz 1.4 if (node._binding > -1) p[node._binding].addNode(node); 39 mfoltz 1.4 } 40 mfoltz 1.1 41 mfoltz 1.1 nodes = g.getNodes(); 42 mfoltz 1.1 while (p[0].size() < g.size()/2) { 43 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 44 mfoltz 1.4 if (node._binding < 0) p[0].addNode(node); 45 mfoltz 1.1 } 46 mfoltz 1.1 47 mfoltz 1.1 while (nodes.hasMoreElements()) { 48 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 49 mfoltz 1.4 if (node._binding < 0) p[1].addNode(node); 50 mfoltz 1.1 } 51 mfoltz 1.1 52 mfoltz 1.1 return; 53 mfoltz 1.1 54 mfoltz 1.1 } 55 mfoltz 1.1 56 mfoltz 1.3 public static long exchange(WeightedGraph g1, WeightedGraph g2) throws Exception { 57 mfoltz 1.1 58 mfoltz 1.1 // we assume g1 and g2 are the same size 59 mfoltz 1.1 60 mfoltz 1.3 int size = g1.size(); 61 mfoltz 1.3 if (size != g2.size()) throw new Exception("exchange bailed on graphs of unequal size!!!"); 62 mfoltz 1.3 63 mfoltz 1.1 // set up A and B 64 mfoltz 1.1 65 mfoltz 1.1 WGNode node; 66 mfoltz 1.1 int pair[] = new int[2], i, j; 67 mfoltz 1.1 Enumeration nodes; 68 mfoltz 1.1 69 mfoltz 1.3 // clone the WeightedGraphs into A and B. 70 mfoltz 1.3 71 mfoltz 1.1 WeightedGraph A = new WeightedGraph(g1); 72 mfoltz 1.1 WeightedGraph B = new WeightedGraph(g2); 73 mfoltz 1.1 74 mfoltz 1.1 // fixPartition will fix the pointers of external edges. 75 mfoltz 1.1 76 mfoltz 1.1 fixPartition(A,B); 77 mfoltz 1.1 fixPartition(B,A); 78 mfoltz 1.1 79 mfoltz 1.1 // System.err.print(A); 80 mfoltz 1.1 // System.err.print(B); 81 mfoltz 1.1 82 mfoltz 1.1 // WeightedGraph A = g1; 83 mfoltz 1.1 // WeightedGraph B = g2; 84 mfoltz 1.1 85 mfoltz 1.1 // compute initial D values 86 mfoltz 1.1 87 mfoltz 1.1 recomputeD(A.getNodes(),A,B); 88 mfoltz 1.1 recomputeD(B.getNodes(),B,A); 89 mfoltz 1.1 90 mfoltz 1.3 WGNode X[] = new WGNode[size]; 91 mfoltz 1.3 WGNode Y[] = new WGNode[size]; 92 mfoltz 1.3 long gains[] = new long[size]; 93 mfoltz 1.1 94 mfoltz 1.3 for (i = 0; i < size; i++) { 95 mfoltz 1.1 96 mfoltz 1.1 // System.err.print("A:\n"+A); 97 mfoltz 1.1 // System.err.print("B:\n"+B); 98 mfoltz 1.1 99 mfoltz 1.1 // create sorted lists of the Ds 100 mfoltz 1.1 101 mfoltz 1.1 WGNode Ap[] = new WGNode[A.size()]; 102 mfoltz 1.1 WGNode Bp[] = new WGNode[B.size()]; 103 mfoltz 1.1 104 mfoltz 1.1 nodes = A.getNodes(); 105 mfoltz 1.1 for (j = 0; j < A.size(); j++) { 106 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 107 mfoltz 1.1 Ap[j] = node; 108 mfoltz 1.1 } 109 mfoltz 1.1 110 mfoltz 1.1 nodes = B.getNodes(); 111 mfoltz 1.1 for (j = 0; j < B.size(); j++) { 112 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 113 mfoltz 1.1 Bp[j] = node; 114 mfoltz 1.1 } 115 mfoltz 1.1 116 mfoltz 1.1 // sort the lists of nodes by D and find a pair to exchange 117 mfoltz 1.1 118 mfoltz 1.1 quicksort(Ap,0,Ap.length-1); 119 mfoltz 1.1 quicksort(Bp,0,Bp.length-1); 120 mfoltz 1.1 121 mfoltz 1.3 System.err.print("Ap: "); 122 mfoltz 1.1 for (j = 0; j < Ap.length; j++) 123 mfoltz 1.3 System.err.print("Ap["+Ap[j]._name+"]="+Ap[j]._d+" "); 124 mfoltz 1.1 System.err.print("\n"); 125 mfoltz 1.1 126 mfoltz 1.3 System.err.print("Bp: "); 127 mfoltz 1.1 for (j = 0; j < Bp.length; j++) 128 mfoltz 1.3 System.err.print("Bp["+Bp[j]._name+"]="+Bp[j]._d+" "); 129 mfoltz 1.1 System.err.print("\n"); 130 mfoltz 1.1 131 mfoltz 1.3 // System.err.print("Bp[] = "); 132 mfoltz 1.3 // for (j = 0; j < Bp.length; j++) 133 mfoltz 1.3 // System.err.print(Bp[j]._d+" "); 134 mfoltz 1.3 // System.err.print("\n"); 135 mfoltz 1.3 136 mfoltz 1.1 gains[i] = findBestPair(Ap, Bp, pair); 137 mfoltz 1.1 138 mfoltz 1.1 System.err.println("Best pair: Ap["+Ap[pair[0]]._name+"] = "+Ap[pair[0]]._d+", Bp["+Bp[pair[1]]._name+"] = "+Bp[pair[1]]._d+"\n"); 139 mfoltz 1.1 140 mfoltz 1.1 // now put the exchange pair into X, Y and remove from A, B 141 mfoltz 1.1 142 mfoltz 1.1 X[i] = Ap[pair[0]]; 143 mfoltz 1.1 Y[i] = Bp[pair[1]]; 144 mfoltz 1.1 145 mfoltz 1.3 A.removeNode(X[i]); 146 mfoltz 1.3 B.removeNode(Y[i]); 147 mfoltz 1.1 148 mfoltz 1.1 // recompute Ds for nodes adjacent to the pair 149 mfoltz 1.1 150 mfoltz 1.3 recomputeD(X[i].getAdjacent(),A,B); 151 mfoltz 1.3 recomputeD(Y[i].getAdjacent(),B,A); 152 mfoltz 1.1 } 153 mfoltz 1.1 154 mfoltz 1.1 // find k to maximize total gain 155 mfoltz 1.1 156 mfoltz 1.1 int k = -1; 157 mfoltz 1.1 long gain = 0, max_gain = 0; 158 mfoltz 1.1 159 mfoltz 1.3 for (i = 0; i < size; i++) { 160 mfoltz 1.3 gain = WeightedGraph.weightPlus(gain,gains[i]); 161 mfoltz 1.1 if (gain > max_gain) { 162 mfoltz 1.1 max_gain = gain; 163 mfoltz 1.1 k = i; 164 mfoltz 1.1 } 165 mfoltz 1.1 } 166 mfoltz 1.1 167 mfoltz 1.1 // swap it 168 mfoltz 1.3 if (max_gain > 0) { 169 mfoltz 1.3 170 mfoltz 1.3 for (i = 0; i <= k; i++) { 171 mfoltz 1.3 System.err.println("exchange "+X[i]._name+" and "+Y[i]._name); 172 mfoltz 1.3 WeightedGraph.exchange(g1, X[i], g2, Y[i]); 173 mfoltz 1.3 } 174 mfoltz 1.1 175 mfoltz 1.1 } 176 mfoltz 1.1 177 mfoltz 1.1 return max_gain; 178 mfoltz 1.1 179 mfoltz 1.1 } 180 mfoltz 1.1 181 mfoltz 1.1 // traverse the lists and pick the best pair a, b to exchange. 182 mfoltz 1.1 private static long findBestPair(WGNode Ap[], WGNode Bp[], int pair[]) { 183 mfoltz 1.1 184 mfoltz 1.1 long gain, max_gain = 0; 185 mfoltz 1.1 int i = 0, j = 0, k; 186 mfoltz 1.1 pair[0] = 0; 187 mfoltz 1.1 pair[1] = 0; 188 mfoltz 1.1 189 mfoltz 1.1 while (i < Ap.length-1 || j < Bp.length-1) { 190 mfoltz 1.1 191 mfoltz 1.1 for (k = 0; k <= j; k++) { 192 mfoltz 1.1 // if (Ap[i]._d + Bp[k]._d < max_gain) return; 193 mfoltz 1.3 gain = WeightedGraph.weightPlus(WeightedGraph.weightPlus(Ap[i]._d,Bp[k]._d), 194 mfoltz 1.3 WeightedGraph.weightPlus(-Ap[i].getWeight(Bp[k]), 195 mfoltz 1.3 -Ap[i].getWeight(Bp[k]))); 196 mfoltz 1.3 System.err.print("gain("+Ap[i]._name+","+Bp[k]._name+")="+gain+"; "); 197 mfoltz 1.1 if (gain > max_gain) { 198 mfoltz 1.1 max_gain = gain; 199 mfoltz 1.1 pair[0] = i; 200 mfoltz 1.1 pair[1] = k; 201 mfoltz 1.1 } 202 mfoltz 1.1 } 203 mfoltz 1.1 204 mfoltz 1.1 for (k = 0; k < i; k++) { 205 mfoltz 1.3 if (WeightedGraph.weightPlus(Ap[k]._d,Bp[j]._d) < max_gain) return max_gain; 206 mfoltz 1.3 gain = WeightedGraph.weightPlus(WeightedGraph.weightPlus(Ap[k]._d,Bp[j]._d), 207 mfoltz 1.3 WeightedGraph.weightPlus(-Ap[k].getWeight(Bp[j]), 208 mfoltz 1.3 -Ap[k].getWeight(Bp[j]))); 209 mfoltz 1.3 System.err.print("gain("+Ap[k]._name+","+Bp[j]._name+")="+gain+"; "); 210 mfoltz 1.1 if (gain > max_gain) { 211 mfoltz 1.1 max_gain = gain; 212 mfoltz 1.1 pair[0] = k; 213 mfoltz 1.1 pair[1] = j; 214 mfoltz 1.1 } 215 mfoltz 1.1 } 216 mfoltz 1.1 217 mfoltz 1.1 if (i < Ap.length-1) i++; 218 mfoltz 1.1 if (j < Bp.length-1) j++; 219 mfoltz 1.1 220 mfoltz 1.1 } 221 mfoltz 1.1 222 mfoltz 1.1 System.err.print("\n"); 223 mfoltz 1.1 224 mfoltz 1.1 return max_gain; 225 mfoltz 1.1 } 226 mfoltz 1.1 227 mfoltz 1.1 228 mfoltz 1.1 // recompute D for nodes in the enumeration, some subset of g1 229 mfoltz 1.1 private static void recomputeD(Enumeration nodes, WeightedGraph g1, WeightedGraph g2) { 230 mfoltz 1.1 231 mfoltz 1.1 Enumeration adjacents, weights; 232 mfoltz 1.1 WGNode node, adjacent; 233 mfoltz 1.1 Long weight; 234 mfoltz 1.1 235 mfoltz 1.1 while (nodes.hasMoreElements()) { 236 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 237 mfoltz 1.1 node._d = 0; 238 mfoltz 1.1 adjacents = node.getAdjacent(); 239 mfoltz 1.1 weights = node.getWeights(); 240 mfoltz 1.1 while (adjacents.hasMoreElements()) { 241 mfoltz 1.1 adjacent = (WGNode) adjacents.nextElement(); 242 mfoltz 1.1 weight = (Long) weights.nextElement(); 243 mfoltz 1.1 if (g1.contains(adjacent)) 244 mfoltz 1.3 node._d = WeightedGraph.weightPlus(node._d,-weight.longValue()); 245 mfoltz 1.3 // node._d -= weight.longValue(); 246 mfoltz 1.1 else if (g2.contains(adjacent)) 247 mfoltz 1.3 node._d = WeightedGraph.weightPlus(node._d,weight.longValue()); 248 mfoltz 1.3 // node._d += weight.longValue(); 249 mfoltz 1.1 } 250 mfoltz 1.1 } 251 mfoltz 1.1 252 mfoltz 1.1 } 253 mfoltz 1.1 254 mfoltz 1.3 // sort nodes in descending order by D. 255 mfoltz 1.1 private static void quicksort(WGNode X[], int i, int j) { 256 mfoltz 1.1 257 mfoltz 1.1 // System.err.println("quicksort(X[],"+i+","+j+")\n"); 258 mfoltz 1.1 259 mfoltz 1.1 if (i >= j) return; 260 mfoltz 1.1 else { 261 mfoltz 1.1 long pivot = X[i]._d; 262 mfoltz 1.1 int k = i; 263 mfoltz 1.1 int m = j; 264 mfoltz 1.1 WGNode temp; 265 mfoltz 1.1 while (k < m) { 266 mfoltz 1.3 while (X[k]._d > pivot && (k < m)) k++; 267 mfoltz 1.3 while (X[m]._d <= pivot && (k < m)) m--; 268 mfoltz 1.1 if (k != m) { 269 mfoltz 1.1 temp = X[m]; 270 mfoltz 1.1 X[m] = X[k]; 271 mfoltz 1.1 X[k] = temp; 272 mfoltz 1.1 } 273 mfoltz 1.1 } 274 mfoltz 1.1 if (j == i + 1) return; 275 mfoltz 1.1 else { 276 mfoltz 1.1 quicksort(X,i,k); 277 mfoltz 1.1 quicksort(X,k+1,j); 278 mfoltz 1.1 } 279 mfoltz 1.1 } 280 mfoltz 1.1 return; 281 mfoltz 1.1 } 282 mfoltz 1.1 283 mfoltz 1.1 private static void fixPartition(WeightedGraph A, WeightedGraph B) { 284 mfoltz 1.1 285 mfoltz 1.1 // fix up edge pointers in A to point to nodes in B. 286 mfoltz 1.1 287 mfoltz 1.1 Enumeration nodes; 288 mfoltz 1.1 WGNode node, to, oldto; 289 mfoltz 1.1 int i; 290 mfoltz 1.1 291 mfoltz 1.1 nodes = A.getNodes(); 292 mfoltz 1.1 while (nodes.hasMoreElements()) { 293 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 294 mfoltz 1.1 for (i = 0; i < node._edges.size(); i++) { 295 mfoltz 1.1 oldto = (WGNode) node._edges.elementAt(i); 296 mfoltz 1.1 to = B.getNode(oldto._name); 297 mfoltz 1.1 if (to != null) node._edges.setElementAt(to,i); 298 mfoltz 1.1 } 299 mfoltz 1.1 } 300 mfoltz 1.1 } 301 mfoltz 1.1 302 mfoltz 1.1 public static long computeEdgeSum(WeightedGraph g1, WeightedGraph g2) { 303 mfoltz 1.1 304 mfoltz 1.1 Enumeration nodes; 305 mfoltz 1.1 WGNode node, to; 306 mfoltz 1.1 int i; 307 mfoltz 1.1 long sum = 0; 308 mfoltz 1.1 309 mfoltz 1.1 nodes = g1.getNodes(); 310 mfoltz 1.1 while (nodes.hasMoreElements()) { 311 mfoltz 1.1 node = (WGNode) nodes.nextElement(); 312 mfoltz 1.1 for (i = 0; i < node._edges.size(); i++) { 313 mfoltz 1.1 to = (WGNode) node._edges.elementAt(i); 314 mfoltz 1.1 if (g2.contains(to)) { 315 mfoltz 1.3 sum = WeightedGraph.weightPlus(sum,((Long) node._weights.elementAt(i)).longValue()); 316 mfoltz 1.1 } 317 mfoltz 1.1 } 318 mfoltz 1.1 } 319 mfoltz 1.1 320 mfoltz 1.1 return sum; 321 mfoltz 1.1 322 mfoltz 1.1 } 323 mfoltz 1.1 324 mfoltz 1.1 325 mfoltz 1.1 326 mfoltz 1.1 } 327 mfoltz 1.1