001    // GraphLab Project: http://graphlab.sharif.edu
002    // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
003    // Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/
004    
005    /**
006     * TestMatrixGraph.java
007     *
008     * Created on November 15, 2004, 4:30 AM
009     */
010    
011    package graphlab.library.test;
012    
013    import graphlab.library.BaseEdge;
014    import graphlab.library.BaseEdgeProperties;
015    import graphlab.library.BaseVertex;
016    import graphlab.library.MatrixGraph;
017    import graphlab.library.algorithms.traversal.BreadthFirstSearch;
018    import graphlab.library.algorithms.traversal.DepthFirstSearch;
019    import graphlab.library.event.handlers.PreWorkPostWorkHandler;
020    import graphlab.library.genericcloners.BaseEdgeVertexCopier;
021    
022    import java.util.Comparator;
023    import java.util.Iterator;
024    
025    /**
026     * @author Omid Aladini
027     */
028    public class TestMatrixGraph {
029    
030        static class SampleTraversalHandler implements PreWorkPostWorkHandler<BaseVertex> {
031            public boolean doPreWork(BaseVertex fromVertex, BaseVertex toVertex) {
032                System.out.print("->" + toVertex.getId());
033                return false;
034            }
035    
036            public boolean doPostWork(BaseVertex returnFrom, BaseVertex returnTo) {
037                System.out.println("<-" + returnTo.getId());
038                return false;
039            }
040    
041        }
042    
043        /*
044          * This class is for comparing two edges according to their weights.
045          * @author Omid Aladini
046          */
047        public static class BaseEdgeWeightComparator
048                implements Comparator<BaseEdge<BaseVertex>> {
049            public int compare(BaseEdge<BaseVertex> o1, BaseEdge<BaseVertex> o2) {
050                if (o1.getWeight() < o2.getWeight())
051                    return -1;
052                else if (o1.getWeight() == o2.getWeight())
053                    return 0;
054                else
055                    return 1;
056            }
057        }
058    
059        public static void main(String args[]) {
060            try {
061                MatrixGraph<BaseVertex, BaseEdge<BaseVertex>> myList = new MatrixGraph<BaseVertex, BaseEdge<BaseVertex>>();
062                BaseVertex v0 = new BaseVertex();
063                BaseVertex v1 = new BaseVertex();
064                BaseVertex v2 = new BaseVertex();
065    
066                myList.insertVertex(v0);
067                myList.insertVertex(v1);
068                myList.insertVertex(v2);
069    
070                myList.insertEdge(new BaseEdge<BaseVertex>(v0, v1, new BaseEdgeProperties(0, 5, false)));
071                myList.insertEdge(new BaseEdge<BaseVertex>(v1, v2, new BaseEdgeProperties(0, 1, false)));
072                myList.insertEdge(new BaseEdge<BaseVertex>(v2, v0, new BaseEdgeProperties(0, 2, false)));
073                myList.dump();
074    
075                BaseVertex v3 = new BaseVertex();
076    
077                myList.insertVertex(v3);
078                myList.insertEdge(new BaseEdge<BaseVertex>(v2, v3, new BaseEdgeProperties(0, 1, false)));
079                myList.insertEdge(new BaseEdge<BaseVertex>(v0, v1, new BaseEdgeProperties(0, 20, false)));
080                System.out.println("||---");
081                myList.dump();
082                System.out.println("||---");
083                myList.copy(new BaseEdgeVertexCopier()).dump();
084                System.out.println("TestMatrixGraph graph traversal");
085                System.out.println("\nDFS");
086    
087                BaseVertex v = myList.getAVertex();
088    
089                Iterator<BaseEdge<BaseVertex>> eIterator = myList.edgeIterator();
090                System.out.print('\n');
091                while (eIterator.hasNext()) {
092                    BaseEdge e = eIterator.next();
093                    System.out.println("An Edge from:" + e.source.getId() + " to:" + e.target.getId());
094                }
095    
096                System.out.println("\nPrim Algorithm on this graph:");
097                myList.dump();
098    //prim output has been changed
099    //                      new Prim<BaseVertex,BaseEdge<BaseVertex>>(myList, new BaseEdgeVertexGraphConverter()).
100    //                                      findMinimumSpanningTree(myList.getAVertex(),new BaseEdgeWeightComparator()).dump();
101    
102                //System.out.println("\nRemoving a vertex " + myList.getVerticesCount());
103                //myList.removeVertex(v);
104    
105                System.out.println("\nBefore traversal");
106                new DepthFirstSearch<BaseVertex, BaseEdge<BaseVertex>>(myList).doSearch(v, new SampleTraversalHandler());
107                new BreadthFirstSearch<BaseVertex, BaseEdge<BaseVertex>>(myList).doSearch(v, new SampleTraversalHandler());
108    
109            } catch (Exception e) {
110                System.out.println("Noooooo:");
111                e.printStackTrace();
112            }
113        }
114    
115    }