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 }