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    package graphlab.library.algorithms.goperators;
006    
007    import graphlab.library.BaseEdge;
008    import graphlab.library.BaseGraph;
009    import graphlab.library.BaseVertex;
010    
011    import java.util.Collection;
012    import java.util.HashMap;
013    import java.util.Iterator;
014    
015    /**
016     * @author Mohammad Ali Rostami
017     * @email ma.rostami@yahoo.com
018     */
019    public class EdgeInduced {
020        public static <VertexType extends BaseVertex, EdgeType extends BaseEdge<VertexType>>
021        BaseGraph<VertexType, EdgeType> edgeInduced(BaseGraph<VertexType, EdgeType> g, Collection<EdgeType> S) {
022            BaseGraph<VertexType, EdgeType> ret = g.createEmptyGraph();
023            HashMap<VertexType, VertexType> vv = new HashMap<VertexType, VertexType>();
024            for (VertexType v : g) {
025                VertexType t = (VertexType) v.getCopy();
026                vv.put(v, t);
027                ret.insertVertex(t);
028            }
029    
030            Iterator<EdgeType> e = g.edgeIterator();
031            while (e.hasNext()) {
032                EdgeType t = e.next();
033                ret.insertEdge((EdgeType) t.getCopy(vv.get(t.source), vv.get(t.target)));
034            }
035    
036            for (EdgeType ee : S) {
037                VertexType v1 = ee.source;
038                VertexType v2 = ee.target;
039                if (ret.getInDegree(v1) + ret.getOutDegree(v1) == 0)
040                    ret.removeVertex(v1);
041                else if (ret.getInDegree(v2) + ret.getOutDegree(v2) == 0)
042                    ret.removeVertex(v2);
043                else
044                    ret.removeEdge(ret.getEdges(vv.get(ee.source), vv.get(ee.target)).get(0));
045            }
046            return ret;
047        }
048    }