DirectionTransformer.java :  » Science » jung-2-2_0_1 » edu » uci » ics » jung » algorithms » transformation » Java Open Source

Java Open Source » Science » jung 2 2_0_1 
jung 2 2_0_1 » edu » uci » ics » jung » algorithms » transformation » DirectionTransformer.java
/*
 * Copyright (c) 2003, the JUNG Project and the Regents of the University 
 * of California
 * All rights reserved.
 *
 * This software is open-source under the BSD license; see either
 * "license.txt" or
 * http://jung.sourceforge.net/license.txt for a description.
 */
/*
 * Created on Apr 21, 2004
 */
package edu.uci.ics.jung.algorithms.transformation;

import org.apache.commons.collections15.Factory;

import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.UndirectedGraph;
import edu.uci.ics.jung.graph.util.EdgeType;
import edu.uci.ics.jung.graph.util.Pair;

/**
 * <p>Functions for transforming graphs into directed or undirected graphs.</p>
 * 
 * 
 * @author Danyel Fisher
 * @author Joshua O'Madadhain
 */
public class DirectionTransformer 
{

    /**
     * Transforms <code>graph</code> (which may be of any directionality)
     * into an undirected graph. (This may be useful for
     * visualization tasks).
     * Specifically:
     * <ul>
     * <li/>Vertices are copied from <code>graph</code>.
     * <li/>Directed edges are 'converted' into a single new undirected edge in the new graph.
     * <li/>Each undirected edge (if any) in <code>graph</code> is 'recreated' with a new undirected edge in the new
     * graph if <code>create_new</code> is true, or copied from <code>graph</code> otherwise.
     * </ul>
     * 
     * @param graph     the graph to be transformed
     * @param create_new specifies whether existing undirected edges are to be copied or recreated
     * @param graph_factory used to create the new graph object
     * @param edge_factory used to create new edges
     * @return          the transformed <code>Graph</code>
     */
    public static <V,E> UndirectedGraph<V,E> toUndirected(Graph<V,E> graph, 
        Factory<UndirectedGraph<V,E>> graph_factory,
            Factory<E> edge_factory, boolean create_new)
    {
        UndirectedGraph<V,E> out = graph_factory.create();
        
        for (V v : graph.getVertices())
            out.addVertex(v);
        
        for (E e : graph.getEdges())
        {
            Pair<V> endpoints = graph.getEndpoints(e);
            V v1 = endpoints.getFirst();
            V v2 = endpoints.getSecond();
            E to_add;
            if (graph.getEdgeType(e) == EdgeType.DIRECTED || create_new)
                to_add = edge_factory.create();
            else
                to_add = e;
            out.addEdge(to_add, v1, v2, EdgeType.UNDIRECTED);
        }
        return out;
    }
    
    /**
     * Transforms <code>graph</code> (which may be of any directionality)
     * into a directed graph.  
     * Specifically:
     * <ul>
     * <li/>Vertices are copied from <code>graph</code>.
     * <li/>Undirected edges are 'converted' into two new antiparallel directed edges in the new graph.
     * <li/>Each directed edge (if any) in <code>graph</code> is 'recreated' with a new edge in the new
     * graph if <code>create_new</code> is true, or copied from <code>graph</code> otherwise.
     * </ul>
     * 
     * @param graph     the graph to be transformed
     * @param create_new specifies whether existing directed edges are to be copied or recreated
     * @param graph_factory used to create the new graph object
     * @param edge_factory used to create new edges
     * @return          the transformed <code>Graph</code>
     */
    public static <V,E> Graph<V,E> toDirected(Graph<V,E> graph, Factory<DirectedGraph<V,E>> graph_factory,
            Factory<E> edge_factory, boolean create_new)
    {
        DirectedGraph<V,E> out = graph_factory.create();
        
        for (V v : graph.getVertices())
            out.addVertex(v);
        
        for (E e : graph.getEdges())
        {
            Pair<V> endpoints = graph.getEndpoints(e);
            if (graph.getEdgeType(e) == EdgeType.UNDIRECTED)
            {
                V v1 = endpoints.getFirst();
                V v2 = endpoints.getSecond();
                out.addEdge(edge_factory.create(), v1, v2, EdgeType.DIRECTED);
                out.addEdge(edge_factory.create(), v2, v1, EdgeType.DIRECTED);
            }
            else // if the edge is directed, just add it 
            {
                V source = graph.getSource(e);
                V dest = graph.getDest(e);
                E to_add = create_new ? edge_factory.create() : e;
                out.addEdge(to_add, source, dest, EdgeType.DIRECTED);
            }
                
        }
        return out;
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.