From ae116fd7b9928d29526cee7858b5064246e1e80f Mon Sep 17 00:00:00 2001
From: Thomas MESLIN <th.meslin@gmail.com>
Date: Thu, 27 Mar 2025 03:45:22 +0100
Subject: [PATCH] Generation des nodes et edges pour faire un graphe

---
 script/src/csv.ml                  | 54 ++++++++++++++++++++++++++++++
 script/src/point_assos_to_gephi.ml | 13 +++++--
 2 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/script/src/csv.ml b/script/src/csv.ml
index e9e0e9b..8d60388 100644
--- a/script/src/csv.ml
+++ b/script/src/csv.ml
@@ -52,6 +52,10 @@ let merge_column rand_csv col_name1 col_name2 new_col_name f =
         {column_name = new_col_name;data = new_data}
 
 
+let del_column csv nom_col = 
+        merge_column csv nom_col nom_col "" (fun a b -> "")
+
+
 let map rand_csv col_name f = begin
         let idx = trouve_indice rand_csv.column_name col_name in
         let new_data = List.map 
@@ -122,5 +126,55 @@ let create_line csv l =
         set_arg l;
         add_line csv arr
 
+let to_graph csv col_name_label =
+        let nodes =  create ["Id";"Label"] in
+        let edges = create ["Source";"Target";"Type";"Id";"Weight"] in
+        let hash_node = Hashtbl.create (List.length csv.column_name) in
+        
+        let rec ajoute_assos node k  nom_assos = match nom_assos with
+                |[] -> node,k
+                |nom_assos :: tl ->
+                        if nom_assos <> "" && not (String.equal nom_assos col_name_label) then begin
+                                Hashtbl.add hash_node nom_assos (string_of_int k);
+                                ajoute_assos (add_line node [|string_of_int k;nom_assos|]) (k+1) tl
+                                end
+                        else
+                                ajoute_assos node k tl
+        in
+        let nodes,k = ajoute_assos nodes 0 csv.column_name in
+        
+        let id = trouve_indice csv.column_name col_name_label in
+
+        let ajoute_label node k =
+                let id = trouve_indice csv.column_name col_name_label in
+                let node,k = List.fold_left (fun (node,acc) arr ->
+                                let label = arr.(id) in 
+                                Hashtbl.add hash_node label (string_of_int acc);
+                                
+                                (add_line node [|string_of_int acc;label|],acc + 1)
+                                )
+                                (node,k) csv.data 
+                                in
+                node,k
+        in
+        let nodes,k = ajoute_label nodes k in
+
+        let ajoute_arete edge label assos k poids = 
+                add_line edge [|Hashtbl.find hash_node label;Hashtbl.find hash_node assos;"Undirected";k;poids|]
+        in
+        let ajoute_arete_ligne edge arr k_i =
+                let label = arr.(id) in
+                let edge,k,_ = List.fold_left (fun (edge,k,i) nom_col -> 
+                        if arr.(i) = "" || nom_col = "" || String.equal nom_col col_name_label 
+                        then 
+                                (edge,k,i+1) 
+                        else 
+                                (ajoute_arete edge label nom_col (string_of_int k) arr.(i),k+1,i+1)) 
+                (edge,k_i,0) csv.column_name
+                in
+                edge,k
+        in
+        let edges,k = List.fold_left (fun (edge,k) arr -> ajoute_arete_ligne edge arr k) (edges,0) csv.data in
 
+        edges,nodes
 
diff --git a/script/src/point_assos_to_gephi.ml b/script/src/point_assos_to_gephi.ml
index a7392eb..5ce0249 100644
--- a/script/src/point_assos_to_gephi.ml
+++ b/script/src/point_assos_to_gephi.ml
@@ -25,7 +25,16 @@ let () = begin
         
         let _ = apply_coef coef_asso points_assos in
         let _ = apply_coef coef_liste points_assos in
-        Csv.save points_assos "../../res_script/point_assos_re_coefficiente.csv"
-                        
+
+        Csv.save points_assos "../../res_script/point_assos_re_coefficiente.csv";
+
+        let points_assos = Csv.merge_column points_assos "NOM" "Prénom" "Nom Prenom" (fun a b -> a ^ " " ^b) in
+        let points_assos = Csv.del_column points_assos "Formation" in
+        let points_assos = Csv.del_column points_assos "Total" in
+        let points_assos = Csv.del_column points_assos "Assos" in
+        let edges,nodes= Csv.to_graph points_assos "Nom Prenom" in
+        Csv.save nodes "../../res_script/nodes.csv";
+        Csv.save edges "../../res_script/edges.csv";
+        print_endline "Graphe généré avec succès !"
 
 end 
-- 
GitLab