package org.seqcode.gseutils.graphs;
import java.util.*;
import org.seqcode.gseutils.*;
import org.seqcode.gseutils.models.Model;
import java.io.*;
public class UndirectedGraph implements Graph {
private HashSet<String> nodes;
private Map<String,Set<String>> edges;
private static SetTools<String> tools;
static {
tools = new SetTools<String>();
}
public UndirectedGraph(UndirectedGraph ug) {
nodes = new HashSet<String>(ug.nodes);
edges = new HashMap<String,Set<String>>();
for(String k : ug.edges.keySet()) {
edges.put(k, new HashSet<String>(ug.edges.get(k)));
}
}
public UndirectedGraph() {
nodes = new HashSet<String>();
edges = new HashMap<String,Set<String>>();
}
public UndirectedGraph(GraphModel m) {
this();
for(int i = 0; i < m.nodes.length; i++) {
addVertex(m.nodes[i]);
}
for(int i = 0; i < m.edges.length; i++) {
addEdge(m.edges[i][0], m.edges[i][1]);
}
}
public GraphModel asModel() { return new GraphModel(this); }
public UndirectedGraph(Collection<String> n, Map<String,Set<String>> e) {
nodes = new HashSet<String>(n);
edges = new HashMap<String,Set<String>>();
for(String node : nodes) {
edges.put(node, new HashSet<String>());
}
for(String v1 : e.keySet()) {
for(String v2 : e.get(v1)) {
if(nodes.contains(v1) && nodes.contains(v2)) {
addEdge(v1, v2);
}
}
}
}
public void printGraph(PrintStream ps) {
TreeSet<String> nodesOrdered = new TreeSet<String>(nodes);
for(String n : nodesOrdered) {
ps.print(n + " : ( ");
for(String nn : edges.get(n)) {
ps.print(nn + " ");
}
ps.println(")");
}
}
public boolean isNeighbor(String v, String n) {
return edges.get(v).contains(n);
}
public void addVertex(String v) {
if(!nodes.contains(v)) {
nodes.add(v);
edges.put(v, new HashSet<String>());
}
}
public void addEdge(String v1, String v2) {
if(nodes.contains(v1) && nodes.contains(v2)) {
edges.get(v1).add(v2);
edges.get(v2).add(v1);
}
}
public boolean containsEdge(String v1, String v2) {
return nodes.contains(v1) && nodes.contains(v2) && edges.get(v1).contains(v2);
}
public void removeEdge(String v1, String v2) {
if(nodes.contains(v1) && nodes.contains(v2)) {
edges.get(v1).remove(v2);
edges.get(v2).remove(v1);
}
}
public void removeVertex(String n) {
nodes.remove(n);
edges.remove(n);
for(String k : edges.keySet()) { edges.get(k).remove(n); }
}
public Set<String> getVertices() {
return new HashSet<String>(nodes);
}
public Set<String> getNeighbors(String vertex) {
return edges.get(vertex);
}
public Graph getSubgraph(Set<String> vs) {
return new UndirectedGraph(vs, edges);
}
}