From 6bf36c9e55d9f5c586f016ba668ac7c9bd645019 Mon Sep 17 00:00:00 2001
From: Gabrielle van de Vijver <gabrielle.van-de-vijver@etu.utc.fr>
Date: Thu, 5 Oct 2023 15:31:56 +0200
Subject: [PATCH] SWFFactory sans gestion d'erreurs

---
 comsoc/TieBreak.go | 58 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 51 insertions(+), 7 deletions(-)

diff --git a/comsoc/TieBreak.go b/comsoc/TieBreak.go
index 341f73b..6e1d47d 100644
--- a/comsoc/TieBreak.go
+++ b/comsoc/TieBreak.go
@@ -19,16 +19,60 @@ func Test_tieBreakFactory(){
 	fmt.Println("Ordre strict :", orderedAlts)
 	lambda:=TieBreakFactory(orderedAlts)
 	bestAlts := []Alternative{3,6}
-	fmt.Println("Premières alternatives à départager :", bestAlts)
+	fmt.Println("Premières alternatives, à départager :", bestAlts)
 	bestAlt,_ := lambda(bestAlts)
 	fmt.Println("Première alternative :", bestAlt)
 }
 
-// func SWFFactory(func swf(p Profile) (Count, error), func ([]Alternative) (Alternative, error)) (func(Profile) ([]Alternative, error)){
+func SWFFactory(swf func (Profile) (Count, error), tb func([]Alternative) (Alternative, error)) (func(Profile) ([]Alternative, error)){
 	
-	
-// 	return func ([]Alternative) (Alternative, error) {
-// 		return orderedAlts[0],nil
-// 	}
-// }
+	return func(p Profile) ([]Alternative, error){
+		//récupération du décompte
+		count,_ := swf(p)
+		//préparation de la sortie
+		var sorted_alts []Alternative
+
+		//PARCOURS DU DECOMPTE
+		for len(count) > 0{
+			//On prend les meilleures alternatives (avant tie break)
+			bestAlts := maxCount(count)
+			//On supprime les meilleures alternatives du décompte
+			for alt := range bestAlts{
+			delete(count, Alternative(alt))
+			}
+		//Départage
+			for len(bestAlts) > 0{
+				bestAlt,_ := tb(bestAlts)
+				//ajout de la meilleure alternative post-tie break
+				sorted_alts = append(sorted_alts, bestAlt)
+				//suppression de l'alternative dans bestAlts
+				indice := rank(bestAlt, bestAlts)
+				bestAlts=append(bestAlts[:indice], bestAlts[indice+1:]...)
+				//suppression de l'alternativ dans le compte 
+				delete(count, Alternative(bestAlt))
+				}
+			}
+			return sorted_alts,nil
+		}
+}
+
+func Test_sWFFactory(){
+	//Définition de l'Ordre strict
+	orderedAlts := []Alternative{8,9,6,1,3,2}
+	fmt.Println("Ordre strict :", orderedAlts)
+
+	//Construction d'un profil avec alternatives ex aequo
+	profil := make([][]Alternative, 2)
+	profil[0] = []Alternative{1, 2, 3,4,5,6}
+	profil[1] = []Alternative{3, 2, 1,4,5,6}
+	fmt.Println("Profil :", profil)
+
+	//Construction de la fonction Tie Break
+	lambda:=TieBreakFactory(orderedAlts)
+	//Construction de la Social Welfare Factory à partir de la fonction swf + la fonction de TieBreak
+	mu := SWFFactory(BordaSWF,lambda)
+	//Construction d'une fonction 
+	sorted_alts,_ := mu(profil)
+	fmt.Println("Alternatives strictement ordonnées selon la méthode de Borda :", sorted_alts)
+}
 //func SCFFactory(func scf(p Profile) ([]Alternative, error), func ([]Alternative) (Alternative, error)) (func(Profile) (Alternative, error))
-- 
GitLab