package gov.nasa.jpl.mbee.mdk.generator.graphs;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class UndirectedHyperGraphHashSet<VertexType, EdgeType extends UndirectedHyperEdge<VertexType>>
extends AbstractGraph<VertexType, EdgeType> implements UndirectedHyperGraph<VertexType, EdgeType> {
protected Map<VertexType, Set<EdgeType>> V2E;
public UndirectedHyperGraphHashSet() {
super();
V2E = new HashMap<VertexType, Set<EdgeType>>();
}
@Override
public boolean addVertex(VertexType vertex) {
boolean added = super.addVertex(vertex);
if (added) {
V2E.put(vertex, new HashSet<EdgeType>());
}
return added;
}
@Override
public boolean removeVertex(VertexType vertex) {
boolean removed = super.removeVertex(vertex);
if (removed) {
V2E.remove(vertex);
}
return removed;
}
@Override
public void clear() {
super.clear();
V2E.clear();
}
@Override
public boolean addEdge(EdgeType edge) {
boolean added = super.addEdge(edge);
if (added) {
for (VertexType v : edge.getVertices()) {
if (V2E.get(v) == null) {
V2E.put(v, new HashSet<EdgeType>());
}
V2E.get(v).add(edge);
}
}
return added;
}
@Override
public boolean removeEdge(EdgeType edge) {
boolean removed = super.removeEdge(edge);
if (removed) {
for (VertexType v : edge.getVertices()) {
assert (V2E.get(v) != null);
V2E.get(v).remove(edge);
}
}
return removed;
}
@Override
public Set<EdgeType> findEdgesOf(VertexType vertex) {
return V2E.get(vertex);
}
@Override
public Set<EdgeType> findEdgesOf(Set<VertexType> vertices) {
Set<EdgeType> edges = new HashSet<EdgeType>();
if (vertices.isEmpty()) {
return edges;
}
boolean isFirstPass = true;
for (VertexType v : vertices) {
if (isFirstPass) {
edges.addAll(V2E.get(v));
isFirstPass = false;
}
else {
edges.retainAll(V2E.get(v));
}
if (edges.isEmpty()) {
break;
}
}
return edges;
}
@Override
public Set<VertexType> findChildrenOf(VertexType vertex) {
return findNeighborsOf(vertex);
}
@Override
public String toString() {
String string = new String();
boolean isFirst = true;
for (VertexType v : getVertices()) {
if (isFirst) {
isFirst = false;
}
else {
string = string.concat(", ");
}
string = string.concat(v.toString());
}
for (EdgeType e : getEdges()) {
string = string.concat("\n" + e.toString());
}
return string;
}
}