BarabasiAlbertGenerator implementation

67 Views Asked by At

I wanted to implement BarabasiAlbertGenerator to generate graph. After creating all Factory objects in main method and changing the Objects (V, E) to (Integer, String) in the generator class, two errors worried me after making all possible modification. 1. index_vertex.put(v, i); type mismatch 2. index_vertex.put(newVertex, new Integer(vertex_index.size() - 1));// an Object of Integer cannot be instantiated. I made several casting the errors still appear. Please any help on how to correct the errors.

    public class BarabasiAlbertGenerator<Integer, String> implements EvolvingGraphGenerator<Integer, String> {


    mGraph = graphFactory.create();

    vertex_index = new ArrayList<Integer>(2*init_vertices);
    index_vertex = new HashMap<Integer, Integer>(2*init_vertices);
    for (int i = 0; i < init_vertices; i++) {
        Integer v = vertexFactory.create();
        mGraph.addVertex(v);
        vertex_index.add(v);
        index_vertex.put(v, i);
        seedVertices.add(v);
    }

    mElapsedTimeSteps = 0;
}

    for (Pair<Integer> pair : added_pairs)
    {
        Integer v1 = pair.getFirst();
        Integer v2 = pair.getSecond();
        if (mGraph.getDefaultEdgeType() != EdgeType.UNDIRECTED || 
                !mGraph.isNeighbor(v1, v2))
            mGraph.addEdge(edgeFactory.create(), pair);
    }
    // now that we're done attaching edges to this new vertex, 
    // add it to the index
    vertex_index.add(newVertex);
    index_vertex.put(newVertex, new Integer(vertex_index.size() - 1));
}




    public static void main(String[] args) {
                SparseGraph<Integer, String> sir = new SparseGraph<Integer, String>();
        ConstantFactory<Graph<Integer, String>> graphFactory = new ConstantFactory<Graph<Integer, String>>(sir);
        InstantiateFactory<Integer> vertexFactory = new InstantiateFactory<Integer>(Integer.class);
        InstantiateFactory<String> edgeFactory = new InstantiateFactory<String>(String.class);
        HashSet<Integer> seedVertices = new HashSet<Integer>();
            int evolve = 1;
            int node = 10;
            int agents = 100;

            BarabasiAlbertGenerator<Integer, String> bbr = new BarabasiAlbertGenerator<Integer, String>(graphFactory, vertexFactory, edgeFactory, agents, node, seedVertices);
            bbr.evolveGraph(evolve);
            Layout<Integer, String> layout = new CircleLayout(sir);
            layout.setSize(new Dimension(300,300));
            BasicVisualizationServer<Integer,String> vv =
            new BasicVisualizationServer<Integer,String>(layout);
            vv.setPreferredSize(new Dimension(350,350));
            // Setup up a new vertex to paint transformer...
            Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() {
            public Paint transform(Integer i) {
            return Color.GREEN;
            }
            };
            // Set up a new stroke Transformer for the edges
            float dash[] = {10.0f};
            final Stroke edgeStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
            BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
            Transformer<String, Stroke> edgeStrokeTransformer =
            new Transformer<String, Stroke>() {
            public Stroke transform(String s) {
            return edgeStroke;
            }
            };
            vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
            vv.getRenderContext().setEdgeStrokeTransformer(edgeStrokeTransformer);
            vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
            //vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
            vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
            JFrame frame = new JFrame("Undirected Graph ");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(vv);
            frame.pack();
            frame.setVisible(true);


}
1

There are 1 best solutions below

0
AudioBubble On

I don't think you want to use InstantiateFactory.

I was able to run your program after changing it to look like this (mostly the vertex and edge factories):

        public static void main(String[] args) {
            SparseGraph<Integer, String> sir = new SparseGraph<Integer, String>();
            ConstantFactory<Graph<Integer, String>> graphFactory = new ConstantFactory<Graph<Integer, String>>(sir);
            Factory<Integer> vertexFactory = new Factory<Integer>() {
                    int i = 0;
                    public Integer create() {
                            return i++;
                    }
            };
            Factory<String> edgeFactory = new Factory<String>() {
                    int i = 0;
                    public String create() {
                            return "" + i++;
                    }
            };
            HashSet<Integer> seedVertices = new HashSet<Integer>();
            int evolve = 1;
            int node = 10;
            int agents = 100;

            BarabasiAlbertGenerator<Integer, String> bbr = new BarabasiAlbertGenerator<Integer, String>(graphFactory, vertexFactory, edgeFactory, agents, node, seedVertices);
            bbr.evolveGraph(evolve);
            Layout<Integer, String> layout = new CircleLayout(sir);
            layout.setSize(new Dimension(300, 300));
            BasicVisualizationServer<Integer, String> vv =
                    new BasicVisualizationServer<Integer, String>(layout);
            vv.setPreferredSize(new Dimension(350, 350));
            // Setup up a new vertex to paint transformer...
            Transformer<Integer, Paint> vertexPaint = new Transformer<Integer, Paint>() {
                    public Paint transform(Integer i) {
                            return Color.GREEN;
                    }
            };
            // Set up a new stroke Transformer for the edges
            float dash[] = {10.0f};
            final Stroke edgeStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
                    BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
            Transformer<String, Stroke> edgeStrokeTransformer =
                    new Transformer<String, Stroke>() {
                            public Stroke transform(String s) {
                                    return edgeStroke;
                            }
                    };
            vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
            vv.getRenderContext().setEdgeStrokeTransformer(edgeStrokeTransformer);
            vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
            //vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
            vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.CNTR);
            JFrame frame = new JFrame("Undirected Graph ");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(vv);
            frame.pack();
            frame.setVisible(true);


    }

Make sure your imports are correct. I used these:

import edu.uci.ics.jung.algorithms.generators.random.BarabasiAlbertGenerator;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer;
import org.apache.commons.collections15.Factory;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantFactory;

import javax.swing.*;
import java.awt.*;
import java.util.HashSet;