Aller au contenu

phil/poll

alpha

Un moteur de vote : des bulletins vérifiés selon les règles de leur scrutin, puis dépouillés en classement.

phil/poll est le noyau par lequel passe chaque vote d'une application : une question à une seule réponse, un choix de plusieurs options, un classement de préférences. Les règles d'un scrutin disent ce qu'un bulletin peut contenir — une option, entre un minimum et un maximum d'options, ou des options classées — et si un bulletin blanc est une abstention. Un bulletin est vérifié selon ces règles tel qu'un formulaire ou une requête le donne. Une méthode de dépouillement transforme les bulletins en classement : le compte des choix pour les bulletins uniques et multiples, le vote alternatif, la méthode Borda et la méthode Schulze pour les bulletins classés. Les options à égalité partagent leur place, un vote alternatif garde ses tours, et les abstentions sont comptées à part.

Elle s'adresse à toute application PHP où les gens votent : un club qui choisit la date de sa prochaine réunion, une communauté qui classe les idées de ses membres, une association qui élit son conseil d'administration, un site qui pose une question à ses lecteurs. Qui peut voter, si les bulletins sont anonymes et où ils sont gardés relèvent de l'application, ou de phil/poll-bundle dans Symfony.

C'est une simple bibliothèque PHP qui n'exige que PHP. Un dépouillement lit les bulletins une seule fois, à partir de n'importe quel itérable : un stockage peut donc les lire en flux depuis sa table. Les méthodes à bulletins classés regroupent les classements identiques : leur mémoire croît avec les classements distincts plutôt qu'avec les bulletins. Les méthodes ne gardent aucun état entre deux dépouillements et peuvent être partagées entre les requêtes d'un worker de longue durée.

État

PartieÉtat
Les règles d'un scrutin : bulletins uniques, multiples et classés, bornes, abstention, de 2 à 100 optionsImplémenté et testé
Bulletins vérifiés selon les règles à partir des valeurs d'un formulaire ou d'une requêteImplémenté et testé
Le compte des choix : majorité simple et vote par approbationImplémenté et testé
Le vote alternatif, ses tours, ses bulletins épuisés et ses bris d'égalitéImplémenté et testé
La méthode Borda et la méthode SchulzeImplémenté et testé
CountingMethods, les méthodes d'une application par nom, et le port d'une méthode propre à l'applicationImplémenté et testé
Scrutins, bulletins et leur anonymat dans Symfony et DoctrineImplémenté dans phil/poll-bundle
Le vote unique transférable d'une élection à plusieurs sièges, les bulletins par notes et par jugement majoritaireNon commencé

Documentation

DocumentCe qu'il couvre
InstallationPrérequis, installation, un premier dépouillement.
Règles et bulletinsLes sortes de bulletins, les options, les bornes, l'abstention, les vérifications.
DépouillementLes quatre méthodes, leurs scores, places, tours et bris d'égalité, et leur coût.
Points d'extensionUne méthode de dépouillement propre à l'application.
ExceptionsPollException et ses trois exceptions.
TestsLes tests de la bibliothèque, son seuil de mutation et son banc d'essai, et comment tester un dépouillement.
RéférenceChaque type de la bibliothèque, avec son rôle.

Démarrage rapide

composer require phil/poll
use Phil\Poll\CountingMethods;
use Phil\Poll\PollRules;

$rules = PollRules::ranked(['tea', 'coffee', 'cocoa'], abstention: true);

$ballots = [
    $rules->ballot(['coffee', 'tea']),
    $rules->ballot(['tea']),
    $rules->ballot(['tea', 'coffee']),
    $rules->ballot(['cocoa', 'tea']),
    $rules->ballot([]),               // an abstention
];

$result = CountingMethods::defaults()->count('instant_runoff', $rules, $ballots);

$result->winners();                   // ['tea']
$result->standings[0]->place;         // 1
\count($result->rounds);              // 2

Prérequis

PHP 8.5 ou plus récent.

Contribuer

Les contributions sont les bienvenues sur le monodépôt PHIL : lisez le guide de contribution et le code de conduite. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. Voyez LICENSE.