// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/
package graphtea.library.test;
import graphtea.library.*;
import graphtea.library.algorithms.spanningtree.Kruskal;
import graphtea.library.algorithms.subgraphs.InducedSubgraphs;
import graphtea.library.algorithms.traversal.BreadthFirstSearch;
import graphtea.library.algorithms.traversal.DepthFirstSearch;
import graphtea.library.algorithms.util.AcyclicChecker;
import graphtea.library.algorithms.util.ConnectivityChecker;
import graphtea.library.event.handlers.PreWorkPostWorkHandler;
import graphtea.library.genericcloners.BaseEdgeVertexCopier;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Vector;
/**
* TestListGraph.java
*
* Created on November 15, 2004, 4:30 AM
* @author Omid Aladini
*/
public class TestListGraph {
static class SampleTraversalHandler implements PreWorkPostWorkHandler<BaseVertex> {
ArrayList<Integer> existanceSet = new ArrayList<>();
public boolean doPreWork(BaseVertex fromVertex, BaseVertex toVertex) {
System.out.print("->" + toVertex.getId());
if (existanceSet.contains(toVertex.getId()))
System.out.println("Oh, double entering!");
else
existanceSet.add(toVertex.getId());
return false;
}
public boolean doPostWork(BaseVertex returnFrom, BaseVertex returnTo) {
System.out.println("");
System.out.print("<-" + returnTo.getId());
return false;
}
}
/*
* This class is for comparing two edges according to their weights.
* @author Omid Aladini
*/
public static class BaseEdgeWeightComparator
implements Comparator<BaseEdge<BaseVertex>> {
public int compare(BaseEdge<BaseVertex> o1, BaseEdge<BaseVertex> o2) {
if (o1.getWeight() < o2.getWeight())
return -1;
else if (o1.getWeight() == o2.getWeight())
return 0;
else
return 1;
}
}
public static void mainCheckAcyclicChecker(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph = new ListGraph<>(true, 0);
BaseVertex v1 = new BaseVertex();
BaseVertex v2 = new BaseVertex();
BaseVertex v3 = new BaseVertex();
BaseVertex v4 = new BaseVertex();
myListGraph.insertVertex(v1);
myListGraph.insertVertex(v2);
myListGraph.insertVertex(v3);
myListGraph.insertVertex(v4);
myListGraph.insertEdge(new BaseEdge<>(v1, v2));
myListGraph.insertEdge(new BaseEdge<>(v2, v3));
myListGraph.insertEdge(new BaseEdge<>(v3, v4));
BaseEdge<BaseVertex> e = new BaseEdge<>(v4, v1);
myListGraph.insertEdge(e);
//myListGraph.removeEdge(e);
System.out.println("Acyclic:" + (AcyclicChecker.isGraphAcyclic(myListGraph) ? "yes" : "no"));
/*
final int iterations = 1000;
int acyclic = 0;
for(int i =0;i<iterations;++i)
{
ListGraph<BaseVertex,BaseEdge<BaseVertex>> myListGraph =
generateRandomListGraph(10,9);
acyclic += AcyclicChecker.isGraphAcyclic(myListGraph)?1:0;
//System.out.println("Graph acyclick: " + isAc);
System.out.println("i:" + i);
}
System.out.println("Graph acyclic: " + ((double)(acyclic))/(iterations)*100 + "% of times.");
*/
}
public static void mainCheckConnectivityChecker(String args[]) {
final int iterations = 100000;
int connected = 0;
for (int i = 0; i < iterations; ++i) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph =
generateRandomListGraph(3, 2);
connected += ConnectivityChecker.isGraphConnected(myListGraph) ? 1 : 0;
}
System.out.println("Graph connected: " + ((double) (connected)) / (iterations) * 100 + "% of times.");
}
public static void mainCheckTraversals(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph =
generateRandomListGraph(30, 100);
System.out.println("-------------DFS TEST-----------");
new DepthFirstSearch<>(myListGraph)
.doSearch(myListGraph.getAVertex(), new SampleTraversalHandler());
for (BaseVertex v : myListGraph)
if (!v.getMark())
System.out.println("Oh, one vertex not traversed!");
System.out.println("\n-------------BFS TEST-----------");
new BreadthFirstSearch<>(myListGraph)
.doSearch(myListGraph.getAVertex(), new SampleTraversalHandler());
for (BaseVertex v : myListGraph)
if (!v.getMark())
System.out.println("Oh, one vertex not traversed!");
}
public static ListGraph<BaseVertex, BaseEdge<BaseVertex>>
generateRandomListGraph(final int vertexCount, final int edgeCount) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph =
new ListGraph<>();
Vector<BaseVertex> vbv = new Vector<>();
for (int i = 0; i < vertexCount; ++i)
vbv.add(new BaseVertex());
for (BaseVertex v : vbv)
myListGraph.insertVertex(v);
java.util.Random r = new java.util.Random(/*109876L*/);
for (int i = 0; i < edgeCount; ++i) {
int randV1 = Math.abs(r.nextInt()) % vertexCount;
int randV2 = Math.abs(r.nextInt()) % vertexCount;
myListGraph.insertEdge(new BaseEdge<>(vbv.get(randV1), vbv.get(randV2), new BaseEdgeProperties(0, 0, false)));
}
return myListGraph;
}
public static <VertexType extends BaseVertex, EdgeType extends BaseEdge<VertexType>>
void
setRandomWeights(BaseGraph<VertexType, EdgeType> graph, int limit) {
java.util.Random r = new java.util.Random();
Iterator<EdgeType> iet = graph.edgeIterator();
while (iet.hasNext())
iet.next().setWeight(Math.abs(r.nextInt()) % limit);
}
public static void mainTestVertexInduced(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph = generateRandomListGraph(30, 100);
myListGraph.dump();
ArrayList<BaseVertex> arr = new ArrayList<>();
for (int i = 0; i < myListGraph.getVerticesCount(); i += 2)
arr.add(myListGraph.getVertexArray()[i]);
BaseGraph<BaseVertex, BaseEdge<BaseVertex>> vInducedGraph =
InducedSubgraphs.getVertexInducedSubgraph(myListGraph, arr);
vInducedGraph.dump();
}
public static void mainTestEdgeInduced(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph = generateRandomListGraph(30, 100);
myListGraph.dump();
ArrayList<BaseEdge<BaseVertex>> arr = new ArrayList<>();
Iterator<BaseEdge<BaseVertex>> it = myListGraph.edgeIterator();
for (int i = 0; i < myListGraph.getEdgesCount(); ++i) {
BaseEdge<BaseVertex> e = it.next();
if (i % 12 == 0)
arr.add(e);
}
BaseGraph<BaseVertex, BaseEdge<BaseVertex>> eInducedGraph =
InducedSubgraphs.getEdgeInducedSubgraph(myListGraph, arr);
eInducedGraph.dump();
}
public static void mainOld(String args[]) {
try {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myList = new ListGraph<>();
BaseVertex v0 = new BaseVertex();
BaseVertex v1 = new BaseVertex();
BaseVertex v2 = new BaseVertex();
myList.insertVertex(v0);
myList.insertVertex(v1);
myList.insertVertex(v2);
myList.insertEdge(new BaseEdge<>(v0, v1, new BaseEdgeProperties(0, 5, false)));
myList.insertEdge(new BaseEdge<>(v1, v2, new BaseEdgeProperties(0, 10, false)));
myList.insertEdge(new BaseEdge<>(v2, v0, new BaseEdgeProperties(0, 2, false)));
myList.dump();
BaseVertex v3 = new BaseVertex();
myList.insertVertex(v3);
myList.insertEdge(new BaseEdge<>(v2, v3, new BaseEdgeProperties(0, 1, false)));
myList.insertEdge(new BaseEdge<>(v0, v1, new BaseEdgeProperties(0, 20, false)));
System.out.println("||---");
myList.dump();
System.out.println("||---");
myList.copy(new BaseEdgeVertexCopier()).dump();
System.out.println("TestMatrixGraph graph traversal");
System.out.println("\nDFS");
BaseVertex v = myList.getAVertex();
Iterator<BaseEdge<BaseVertex>> eIterator = myList.edgeIterator();
System.out.print('\n');
while (eIterator.hasNext()) {
BaseEdge e = eIterator.next();
System.out.println("An Edge from:" + e.source.getId() + " to:" + e.target.getId());
}
System.out.println("\nPrim Algorithm on this graph:");
myList.dump();
//prim output has been changed
// new Prim<BaseVertex,BaseEdge<BaseVertex>>(myList, new BaseEdgeVertexGraphConverter()).
// findMinimumSpanningTree(myList.getAVertex(),new BaseEdgeWeightComparator()).dump();
//System.out.println("\nRemoving a vertex " + myList.getVerticesCount());
//myList.removeVertex(v);
System.out.println("\nBefore traversal");
new DepthFirstSearch<>(myList).doSearch(v, new SampleTraversalHandler());
new BreadthFirstSearch<>(myList).doSearch(v, new SampleTraversalHandler());
} catch (Exception e) {
System.out.println("Noooooo:");
e.printStackTrace();
}
}
public static void mainTestKruskal(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> l = new ListGraph<>();
ListGraph<BaseVertex, BaseEdge<BaseVertex>> f = l.createEmptyGraph();
final int iterations = 100;
for (int i = 0; i < iterations; ++i) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> myListGraph =
generateRandomListGraph(50, 90);
setRandomWeights(myListGraph, 20);
int count = Kruskal.findMinimumSpanningTree(myListGraph).size();
System.out.println("Size of spanning tree:" + count);
}
}
public static void main/*TestLightEdgeIterator*/(String args[]) {
ListGraph<BaseVertex, BaseEdge<BaseVertex>> g
= new ListGraph<>(false, 3);
BaseVertex v[] = new BaseVertex[3];
for (int i = 0; i < 3; i++) {
v[i] = new BaseVertex();
g.insertVertex(v[i]);
}
g.insertEdge(new BaseEdge<>(v[1], v[0]));
g.insertEdge(new BaseEdge<>(v[2], v[1]));
Iterator<BaseEdge<BaseVertex>> ie = g.lightEdgeIterator(v[1]);
while (ie.hasNext()) {
System.out.println(ie.next());
}
System.out.println("**");
for (BaseVertex vv : g.getNeighbors(v[1]))
System.out.println(vv);
}
}