# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 21:28:40 2021

@author: huguet
"""

from myplotlib import print_1d_data, print_2d_data, print_dendrogramme
from mydatalib import extract_data_2d, scale_data
from mydatalib import apply_agglomerative_clustering
from mydatalib import evaluate_agglomerative_clustering


##################################################################
# READ a data set (arff format)

# Parser un fichier de données au format arff
# datanp est un tableau (numpy) d'exemples avec pour chacun la liste
# des valeurs des features

# Note 1 :
# dans les jeux de données considérés : 2 features (dimension 2 seulement)
# t =np.array([[1,2], [3,4], [5,6], [7,8]])
#
# Note 2 :
# le jeu de données contient aussi un numéro de cluster pour chaque point
# --> IGNORER CETTE INFORMATION ....
#    2d-4c-no9.arff   xclara.arff

path = './artificial/'
dataset_name = "xclara"
save = True

print("-----------------------------------------------------------")
print("     Chargement du dataset : " + dataset_name)
data = extract_data_2d(path + dataset_name)
print_2d_data(data, dataset_name=dataset_name +
              "_brutes", stop=False, save=save)

print("-----------------------------------------------------------")
print("     Mise à l'échelle")
data_scaled = scale_data(data)
print_2d_data(data_scaled, dataset_name=dataset_name +
              "_scaled", stop=False, save=save)

# Types de linkage : single, average, complete, ward linkage
linkage = "complete"

print("-----------------------------------------------------------")
print("     Création du dendrogramme : linkage " + linkage)
print_dendrogramme(data_scaled, dataset_name=dataset_name,
                   linkage=linkage, stop=False)


k_max = 10
print("-----------------------------------------------------------")
print("     Création clusters : linkage " +
      linkage + ", k=(0 to " + str(k_max) + ")")
# Application du clustering agglomeratif pour plusieurs valeurs de k
# et evaluation de la solution
k = []
durations = []
silouettes = []
for i in range(2, k_max):
    # Application du clustering agglomeratif
    (model, duration) = apply_agglomerative_clustering(
        data_scaled, k=i, linkage=linkage)
    # Affichage des clusters
    print_2d_data(data_scaled, dataset_name=dataset_name,
                  method_name="agglomerative_" + linkage, k=i,
                  stop=False, save=save, c=model.labels_)
    # Evaluation de la solution de clustering
    silouette = evaluate_agglomerative_clustering(data_scaled, model)
    # Enregistrement des valeurs
    k += [i]
    durations += [duration]
    silouettes += [silouette]

# Affichage des résultats
print_1d_data(k, k, x_name="k", y_name="k", dataset_name=dataset_name,
              method_name="agglomerative_" + linkage, stop=False, save=save)
print_1d_data(k, durations, x_name="k", y_name="temps_de_calcul", y_unit="ms",
              dataset_name=dataset_name,
              method_name="agglomerative_" + linkage, stop=False, save=save)
print_1d_data(k, silouettes, x_name="k", y_name="coeficient_de_silhouette",
              dataset_name=dataset_name,
              method_name="agglomerative_" + linkage, stop=False, save=save)
