diff --git a/comsoc/majority.go b/comsoc/majority.go new file mode 100644 index 0000000000000000000000000000000000000000..4784ae5b0dbed3cf5d8e87cdce3a75c94e677537 --- /dev/null +++ b/comsoc/majority.go @@ -0,0 +1,15 @@ +package comsoc + +import() + +func MajoritySWF(p Profile) (count Count, err error) { + for i,voter := range p { + count[voter[0]] += 1 + } // 0-votes alternatives are not included + return count, nil +} + +func MajoritySCF(p Profile) (bestAlts []Alternative, err error){ + count,_ := MajoritySWF(p) + return maxCount(count), nil +} diff --git a/comsoc/utils.go b/comsoc/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..0910627687411da35e2fffd64141acf7fcedf4f3 --- /dev/null +++ b/comsoc/utils.go @@ -0,0 +1,63 @@ +package comsoc + +import ("errors") + +type Alternative int +type Profile [][]Alternative +type Count map[Alternative]int + +// renvoie l'indice ou se trouve alt dans prefs +func rank(alt Alternative, prefs []Alternative) int{ + for i,v := range prefs { + if alt == v { + return i + } + } + return -1 +} + +// renvoie vrai ssi alt1 est préférée à alt2 +func isPref(alt1, alt2 Alternative, prefs []Alternative) bool { + return rank(alt1, prefs) > rank(alt2, prefs) +} + +// renvoie les meilleures alternatives pour un décomtpe donné +func maxCount(count Count) (bestAlts []Alternative) { + max := 0 + for _,v := range count { + switch { + case v == max: + bestAlts = append(bestAlts, Alternative(v)) + case v > max: + bestAlts = []Alternative{Alternative(v)} + // bestAlts = append(bestAlts, v) + max = v + } + } + return +} + +// vérifie le profil donné, par ex. qu'ils sont tous complets et que chaque alternative n'apparaît qu'une seule fois par préférences +func checkProfile(prefs Profile) error + +// vérifier que tout le monde a les mêmes alternatives, qu'il n'est pas vide + + +// vérifie le profil donné, par ex. qu'ils sont tous complets et que chaque alternative de alts apparaît exactement une fois par préférences +func checkProfileAlternative(prefs Profile, alts []Alternative) error { + for _,voter := range prefs { + if len(voter) != len(alts) { + return errors.New("001: ProfileErrors") + } + check := make(map[Alternative]int) + for _,alt := range voter { + check[alt] += 1 + if check[alt] > 1 { + return errors.New("001: ProfileErrors") + } + } + } + return nil +} + +//jerome.gaigne@hds.utc.fr