1 25 38 package org.jgrapht.experimental.isomorphism; 39 40 import java.util.*; 41 42 import org.jgrapht.*; 43 import org.jgrapht.util.*; 44 45 46 58 public class GraphOrdering<V, E> 59 { 60 61 63 67 private Map<V, Integer > mapVertexToOrder; 68 69 72 private Set<LabelsEdge> labelsEdgesSet; 73 74 76 83 public GraphOrdering(Graph<V, E> regularGraph) 84 { 85 this(regularGraph, regularGraph.vertexSet(), regularGraph.edgeSet()); 86 } 87 88 97 public GraphOrdering( 98 Graph<V, E> regularGraph, 99 Set<V> vertexSet, 100 Set<E> edgeSet) 101 { 102 init(regularGraph, vertexSet, edgeSet); 103 } 104 105 107 private void init(Graph<V, E> g, Set<V> vertexSet, Set<E> edgeSet) 108 { 109 112 this.mapVertexToOrder = new HashMap<V, Integer >(vertexSet.size()); 113 114 int counter = 0; 115 for (V vertex : vertexSet) { 116 mapVertexToOrder.put(vertex, new Integer (counter)); 117 counter++; 118 } 119 120 126 this.labelsEdgesSet = new HashSet<LabelsEdge>(edgeSet.size()); 127 for (E edge : edgeSet) { 128 V sourceVertex = g.getEdgeSource(edge); 129 Integer sourceOrder = mapVertexToOrder.get(sourceVertex); 130 int sourceLabel = sourceOrder.intValue(); 131 int targetLabel = 132 (mapVertexToOrder.get(g.getEdgeTarget(edge))).intValue(); 133 134 LabelsEdge lablesEdge = new LabelsEdge(sourceLabel, targetLabel); 135 this.labelsEdgesSet.add(lablesEdge); 136 137 if (g instanceof UndirectedGraph) { 138 LabelsEdge oppositeEdge = 139 new LabelsEdge(targetLabel, sourceLabel); 140 this.labelsEdgesSet.add(oppositeEdge); 141 } 142 } 143 } 144 145 148 public boolean equalsByEdgeOrder(GraphOrdering otherGraph) 149 { 150 boolean result = 151 this.getLabelsEdgesSet().equals(otherGraph.getLabelsEdgesSet()); 152 153 return result; 154 } 155 156 public Set<LabelsEdge> getLabelsEdgesSet() 157 { 158 return labelsEdgesSet; 159 } 160 161 168 public String toString() 169 { 170 StringBuffer sb = new StringBuffer (); 171 sb.append("mapVertexToOrder="); 172 173 Object [] vertexArray = new Object [this.mapVertexToOrder.size()]; 175 Set<V> keySet = this.mapVertexToOrder.keySet(); 176 for (V currVertex : keySet) { 177 Integer index = this.mapVertexToOrder.get(currVertex); 178 vertexArray[index.intValue()] = currVertex; 179 } 180 sb.append(ArrayUtil.toString(vertexArray)); 181 sb.append("labelsOrder=").append(this.labelsEdgesSet.toString()); 182 return sb.toString(); 183 } 184 185 187 private class LabelsEdge 188 { 189 private int source; 190 private int target; 191 private int hashCode; 192 193 public LabelsEdge(int aSource, int aTarget) 194 { 195 this.source = aSource; 196 this.target = aTarget; 197 this.hashCode = 198 new String (this.source + "" + this.target).hashCode(); 199 } 200 201 207 public boolean equals(Object obj) 208 { 209 LabelsEdge otherEdge = (LabelsEdge) obj; 210 if ( 211 (this.source == otherEdge.source) 212 && (this.target == otherEdge.target)) { 213 return true; 214 } else { 215 return false; 216 } 217 } 218 219 222 public int hashCode() 223 { 224 return this.hashCode; } 226 227 public String toString() 228 { 229 return this.source + "->" + this.target; 230 } 231 } 232 } 233 | Popular Tags |