import java.io.IOException;

import org.graphstream.graph.Graph;
import org.graphstream.algorithm.Toolkit;
import org.graphstream.graph.implementations.SingleGraph;
import org.graphstream.stream.file.FileSourceEdge;

public class TP2 {

	public static void main(String[] args) {
		Graph graphe = new SingleGraph("Graphe");

		FileSourceEdge fs = new FileSourceEdge();

		fs.addSink(graphe);

		try {
			fs.readAll("data/com-dblp.ungraph.txt");
		} catch (IOException e) {
			System.out.println("Fichier non trouvé");
		} finally {
			fs.removeSink(graphe);
		}

		System.out.println("Question n°2");

		System.out.println("Nombre de noeuds : " + graphe.getNodeCount());
		System.out.println("Nombre d'arrêtes : " + graphe.getEdgeCount());
		System.out.println("Degré moyen : " + Toolkit.averageDegree(graphe));
		System.out.println("Coefficient de clustering moyen : " + Toolkit.averageClusteringCoefficient(graphe));
		System.out.println("Coefficient de clustering pour un réseau aléatoire de même taille et du même degré moyen: "+
				Toolkit.averageDegree(graphe)/graphe.getNodeCount());

		System.out.println("\nQuestion n°3");

		System.out.println("Le réseau est connexe : " + Toolkit.isConnected(graphe));
		System.out.println("Un réseau aléatoire de la même taille et degré moyen sera-t-il connexe ? " +
							(Toolkit.averageDegree(graphe) > Math.log(graphe.getNodeCount())));
		System.out.println("À partir de quel degré moyen un réseau aléatoire avec cette taille devient connexe ? " +
				Math.log(graphe.getNodeCount()));


		//Question 4

		// distribution des degrés
		double[] degree = normaliser(graphe);
		CreationFichier.creerFichier(degree);

		// graphe Linéaire
		CreationFichier.creerGrapheLineaire();

		// graphe Log Log
		CreationFichier.creerGrapheLogLog();

		// graphe distribution poisson
		CreationFichier.creerGraphePoisson();
	}

	public static double[] normaliser(Graph g)
	{
		int[] dd = Toolkit.degreeDistribution(g);
		double[] degree = new double[dd.length];
		for (int k = 0; k < dd.length; k++) {
			if (dd[k] != 0) {
				degree[k] = (double)dd[k] / g.getNodeCount();
			}
		}
		return degree;
	}


}