import java.io.IOException;
import java.util.List;

import org.graphstream.graph.BreadthFirstIterator;
import org.graphstream.graph.Graph;
import org.graphstream.algorithm.Toolkit;
import org.graphstream.graph.Node;
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();

		//Question 5
		System.out.println("\nQuestion n°5");


		List<Node> randomNode= Toolkit.randomNodeSet(graphe,1000);
		BreadthFirstIterator bfi = new BreadthFirstIterator(randomNode.get(0));

		//parcours en largeur de notre graphe
		while(bfi.hasNext())
			bfi.next();

		double distance=0;
		int[] distanceDistri = new int[bfi.getDepthMax()+1];
		for (Node n:randomNode )
		{
			//Addition les liens des 1000 noeuds pris au hasard
			distance += bfi.getDepthOf(n);
			//Récupere la distribution des distances
			distanceDistri[bfi.getDepthOf(n)]++;
		}

		double distanceMoyene = distance/1000.0;
		System.out.println("Distane moyenne: " +distanceMoyene);

		System.out.println("L'hypothèse des six degrés de séparation  :" +(distanceMoyene<=6.0));
		double petitMonde = (Math.log(graphe.getNodeCount())/Math.log(Toolkit.averageDegree(graphe)));
		System.out.println("ln(N)/ln(<k>) :" + petitMonde);

		CreationFichier.creerFichier(distanceDistri);
		CreationFichier.creerGrapheDistance();
	}

	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;
	}


}