// method for flow graph visualization
  public static void visualizeGraph(int[][] matrix, int N, int k) {
    Graph<Integer, String> graph = new DirectedSparseGraph<Integer, String>();

    for (int i = 0; i < matrix.length; i++) {
      graph.addVertex((Integer) i);
    }

    for (int i = 0; i < matrix.length; i++) {
      for (int j = 0; j < matrix[i].length; j++) {
        // only select edge that has flow bigger than 0
        if (matrix[i][j] > 0) {
          graph.addEdge(i + "->" + j, i, j, EdgeType.DIRECTED);
        }
      }
    }

    Layout<Integer, String> layout = new CircleLayout<Integer, String>(graph);
    layout.setSize(new Dimension(800, 800));

    BasicVisualizationServer<Integer, String> vv =
        new BasicVisualizationServer<Integer, String>(layout);
    Transformer<Integer, Paint> vertexPaint =
        new Transformer<Integer, Paint>() {
          public Paint transform(Integer i) {
            return Color.YELLOW;
          }
        };

    vv.setPreferredSize(new Dimension(800, 800));
    vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>());
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);

    JFrame frame = new JFrame("Network Visualization - N = " + N + ", k = " + k);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(vv);
    frame.pack();
    frame.setVisible(true);
  }
  public static void main(String[] args) {

    File tweetFile;

    if (args.length > 0) {
      tweetFile = new File(args[0]);
    } else {
      tweetFile =
          new File(
              "C:\\Users\\IBM_ADMIN\\Desktop\\Twitter\\TwitterDataAnalytics\\TwitterDataAnalytics\\owssad.json");
    }

    DirectedGraph<UserNode, RetweetEdge> retweetGraph =
        TweetFileToGraph.getRetweetNetwork(tweetFile);

    /*
     * Converts a node to its string representation
     */
    Transformer<UserNode, String> stringer =
        new Transformer<UserNode, String>() {
          public String transform(UserNode n) {
            return n.toString();
          }
        };

    /*
     * Calculate the centrality
     */
    // calculate the betweenness centrality
    //		final InDegreeScorer<UserNode> centralityScore = new InDegreeScorer<UserNode>(retweetGraph);
    //		final BetweennessCentrality<UserNode, RetweetEdge> centralityScore = new
    // BetweennessCentrality<UserNode, RetweetEdge>(retweetGraph);
    //		final PageRank<UserNode, RetweetEdge> centralityScore = new PageRank<UserNode,
    // RetweetEdge>(retweetGraph, 0.85);
    final EigenvectorCentrality<UserNode, RetweetEdge> centralityScore =
        new EigenvectorCentrality<UserNode, RetweetEdge>(retweetGraph);
    centralityScore.evaluate();

    double centralityMax = 0.0f;
    for (UserNode node : retweetGraph.getVertices()) {
      centralityMax = Math.max(centralityMax, centralityScore.getVertexScore(node));
    }
    final double centralityMaxFinal = centralityMax;

    /*
     * Sizes a node by some centrality measure
     */
    Transformer<UserNode, Shape> shaper =
        new Transformer<UserNode, Shape>() {
          public Shape transform(UserNode n) {
            System.out.println(
                "User: "******" Cent: "
                    + centralityScore.getVertexScore(n)
                    + " Max: "
                    + centralityMaxFinal);
            double radius = 50 * (centralityScore.getVertexScore(n)) / centralityMaxFinal;
            radius = Math.max(radius, 5.0f);
            float fRadius = (float) radius;
            return new Ellipse2D.Float(-fRadius / 2, -fRadius / 2, fRadius, fRadius);
          }
        };

    Layout<UserNode, RetweetEdge> layout = new KKLayout<UserNode, RetweetEdge>(retweetGraph);
    layout.setSize(new Dimension(500, 500));

    BasicVisualizationServer<UserNode, RetweetEdge> vv =
        new BasicVisualizationServer<UserNode, RetweetEdge>(layout);
    vv.setPreferredSize(new Dimension(550, 550));
    vv.getRenderContext().setVertexLabelTransformer(stringer);
    vv.getRenderContext().setVertexShapeTransformer(shaper);

    JFrame jframe = new JFrame("Simple Graph View");
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.getContentPane().add(vv);
    jframe.pack();
    jframe.setVisible(true);
  }