
// MakeGraphs.java
// Barak Naveh and Contributors, 2021
// Modified by Andrew Davison, ad@coe.psu.ac.th, Jan. 2023

/* Build graphs using:
     -  SimpleGraph (an unweighted, undirected graph);
     -  DefaultDirectedGraph (an unweighted, directed graph);
             - use the DefaultEdge class for the edges

     - SimpleWeightedGraph (a weighted, undirected graph);
     - DefaultDirectedWeightedGraph  (a weighted, directed graph);
             - use my WeightedEdge class for the edges
               which assumes the weights are integers.

  Usage:
    > compile MakeGraphs.java
    > run MakeGraphs
*/

import java.io.*;
import java.util.*;
import java.awt.image.*;

import org.jgrapht.*;
import org.jgrapht.graph.*;



public final class MakeGraphs
{

  public static void main(String[] args)
  {
    unweighted();
    weighted();
  }  // end of main()


  private static void unweighted()
  {
    System.out.println("\n--------------- unweighted --------------");

    // uncomment one of these...
    // Graph<String, DefaultEdge> g = new SimpleGraph<>(DefaultEdge.class);   // undirected
    Graph<String, DefaultEdge> g = new DefaultDirectedGraph<>(DefaultEdge.class);   // directed

    g.addVertex("v1");
    g.addVertex("v2");
    g.addVertex("v3");
    g.addVertex("v4");

    g.addEdge("v1", "v2");   // unweighted
    g.addEdge("v2", "v3");
    g.addEdge("v3", "v4");
    g.addEdge("v4", "v1");

    // display the graph in various ways
    System.out.println("Graph:\n" + g + "\n");
    System.out.println("Is graph directed: " +  g.getType().isDirected());
    System.out.println("Is graph weighted: " + g.getType().isWeighted());

    System.out.println("Adj List:\n" + JGTUtils.writeAdjList(g));
    System.out.println("Adj Matrix:\n" + JGTUtils.writeAdjMatrix(g));

    JGTUtils.displayAsDOT("unweighted", g);
    JGTUtils.displayAsMX("unweighted", g);
  } /* unweighted */


  private static void weighted()
  {
    System.out.println("\n--------------- weighted --------------");

    // uncomment one of these...
    Graph<String, WeightedEdge> g = new SimpleWeightedGraph<>(WeightedEdge.class);   // undirected
    // Graph<String, WeightedEdge> g = new DefaultDirectedWeightedGraph<>(WeightedEdge.class);  // directed

    g.addVertex("v1");
    g.addVertex("v2");
    g.addVertex("v3");

    WeightedEdge e = g.addEdge("v1", "v2");
    g.setEdgeWeight(e, 2);    // weighted
    e = g.addEdge("v2", "v3");
    g.setEdgeWeight(e, 3);
    e = g.addEdge("v3", "v1");
    g.setEdgeWeight(e, 4);

    // display the graph in various ways
    System.out.println("Graph:\n" + g + "\n");
    System.out.println("Is graph directed: " +  g.getType().isDirected());
    System.out.println("Is graph weighted: " +  g.getType().isWeighted());

    System.out.println("Adj List:\n" + JGTUtils.writeAdjList(g));
    System.out.println("Adj Matrix:\n" + JGTUtils.writeAdjMatrix(g));

    JGTUtils.displayAsDOT("weighted", g);
    JGTUtils.displayAsMX("weighted", g);

    // save graph image as a PNG picture, and display
    // JGTUtils.writeDOTImage(g, "graphImageTest.png");
    JGTUtils.writeMXImage(g, "graphImageTest.png");

    ImageViewer.view("graphImageTest.png", "graphImageTest.png");
  } /* weighted */

}  // end of MakeGraphs class
