Vada al contenuto
Condorcet.vote Alpha
← Documentazione tecnica

Scrutinio e riconteggio

Il risultato non è mai un blocco del registro: è un ricalcolo deterministico, a partire dalla configurazione pubblicata e dalle schede firmate, che chiunque può ripetere.

Ciò che fa fede è l’elenco immutabile delle schede firmate; il ricalcolo ne è una verifica incrociata. Una divergenza tra due implementazioni o due versioni della libreria sarebbe un difetto di un programma di calcolo, non una falla di verificabilità: le schede pubblicate restano invariate. Tutti i metodi proposti sono deterministici, quindi il risultato è stabile per un dato elenco di schede.

Protocollo v1

Dati in ingresso

Che cosa legge il riconteggio.

Soltanto dati pubblici: la configurazione congelata (blocco 0), le schede (blocchi di voti), la lista elettorale di chiusura per i pesi e il metodo pubblicato con il risultato. Il documento CEF non è un dato in ingresso necessario.

candidates[].label stringhe · configuration
I candidati dichiarati, compresi quelli che nessuno ha classificato. L’etichetta è l’unico identificativo del candidato.
election_type preferential | fptp · configuration
Classifica (metodi Condorcet) o scelta singola (scrutinio maggioritario). Determina anche la regola di classifica implicita.
ballot_rules oggetto · configuration
I quattro parametri della scheda, da cui i vincoli di scrutinio discendono secondo una regola fissa (qui sotto).
seats intero ≥ 1 · configuration
Il numero di eletti: le prime seats posizioni della classifica.
weighted_voting booleano · configuration
Se vero, ogni scheda pesa il peso firmato nel suo payload; altrimenti ogni scheda pesa 1.
ballots[].payload stringa JSON · votes
Il payload firmato: il suo campo ballot (classifica CEF o /EMPTY_RANKING/) e il suo campo weight.
electoral_roll[].weight intero ≥ 1 · closure
Il peso autorizzato di ciascun elettore, per controllare i pesi firmati di un’elezione ponderata.
metodo nome canonico · risultato
Scelto dall’organizzatore, congelato con la configurazione all’avvio, pubblicato con il risultato e non nella catena. Indicato con il suo nome esatto nella libreria, per esempio Schulze Winning.
Schede

Ogni scheda pubblicata, una regola meccanica.

Il contenuto di una scheda non viene convalidato al deposito: decide lo scrutinio, secondo una regola pubblica e deterministica. Una scheda scartata resta pubblicata e verificabile; è soltanto esclusa dalla classifica.

  1. 1 Verificare. Ogni scheda pubblicata reca una firma ad anello valida e un’immagine di chiave unica nell’elezione: la piattaforma lo controlla alla ricezione, il verificatore lo ricontrolla. Un esito negativo sarebbe un difetto del registro, non una regola di scrutinio.
  2. 2 Filtrare il formato. Il campo ballot supera il controllo rigoroso di cef-writer: una stringa vuota, il separatore di tag ||, un rango vuoto (A>>B), UTF-8 non valido, un a capo, i caratteri riservati ; , # / * ^ o un candidato ripetuto lo respingono. L’analizzatore della libreria lo legge poi, e può a sua volta rifiutarlo. Una scheda respinta è nulla per formato: non diventa mai un voto.
  3. 3 Riconoscere la scheda bianca. La sentinella /EMPTY_RANKING/ è una scheda bianca: un’astensione, conteggiata.
  4. 4 Applicare i vincoli. I vincoli dedotti da ballot_rules classificano ogni voto come valido o nullo per vincolo. Una classifica che nomina un candidato non dichiarato conta come espressa; il nome sconosciuto è ignorato nei confronti a coppie.
  5. 5 Pesare. In un’elezione ponderata, il peso applicato è il weight del payload firmato, mai un moltiplicatore letto nella classifica (il filtro di formato lo vieta). I pesi firmati devono formare esattamente il multinsieme dei pesi degli elettori contrassegnati has_voted, la cui somma vale totals.voted_weight. Senza ponderazione, ogni voto pesa 1.

Dai parametri ai vincoli

NoTie se ties_allowed = false
Respinge un voto che esprime una parità, compresa la parità implicita dei candidati non classificati di una classifica parziale.
NoBlankVote se blank_allowed = false
Respinge la scheda bianca: diventa allora nulla per vincolo anziché bianca.
CompleteRanking se partial_ranking_allowed = false
Respinge una classifica che non nomina esplicitamente tutti i candidati.
Implicit Ranking secondo election_type
Attiva per preferential: un candidato non classificato è a pari merito all’ultimo posto. Disattiva per fptp: una scelta singola lascia gli altri candidati non classificati.

I vincoli non sono pubblicati in quanto tali: discendono dai parametri pubblicati secondo questa regola. Una scheda bianca è un’astensione, né una parità né una classifica parziale: NoTie e CompleteRanking la esentano, solo NoBlankVote la respinge. La piattaforma applica questa esenzione mediante proprie varianti dei vincoli nativi di CondorcetPHP; un riconteggio indipendente deve riprodurla.

Per un’elezione fptp i parametri pubblicati sono fissi (parità vietate, classifica parziale ammessa, classifica completa mai richiesta): NoTie si applica sempre, NoBlankVote quando l’astensione è vietata. Una classifica con più preferenze vi è letta alla sua prima preferenza.

Conteggi

Sei contatori, due invarianti.

Calcolati una volta per scrutinio, identici per tutti i metodi. Un riconteggio con gli stessi vincoli deve riprodurli esattamente.

total intero
I voti registrati dalla libreria.
valid intero
I voti che superano tutti i vincoli.
expressed intero
I voti validi e non bianchi: quelli che formano la classifica.
blank intero
I voti validi con classifica vuota (/EMPTY_RANKING/).
invalidByConstraint intero
I voti registrati ma respinti da un vincolo: i nulli per vincolo.
invalidByFormat intero
Le schede che non sono mai diventate un voto: i nulli per formato, esclusi da total.

total = valid + invalidByConstraint; valid = expressed + blank. Il numero di nulli pubblicato è invalidByFormat + invalidByConstraint. La stessa ripartizione, sommata per peso anziché per scheda, dà i voti di un’elezione ponderata (senza corrispettivo per invalidByFormat: quelle schede non hanno peso); senza ponderazione ricopia i conteggi.

Metodi

Un metodo, fissato prima del voto.

La piattaforma non implementa alcun algoritmo di voto: ogni metodo è quello della libreria julien-boudry/condorcet (CondorcetPHP), indicato con il suo nome esatto. Il tipo di elezione è pubblicato nel blocco 0; il metodo, scelto dall’organizzatore, è congelato con la configurazione all’avvio e pubblicato con il risultato.

FPTP fptp
Scrutinio maggioritario uninominale: vince il candidato con più voti, con più peso in un’elezione ponderata. Il risultato resta una classifica completa.
Schulze Winning preferential · predefinito
Schulze, variante dei voti vincenti.
Schulze Margin preferential
Schulze, variante dei margini.
Ranked Pairs Winning preferential
Ranked Pairs (Tideman), variante dei voti vincenti.
Ranked Pairs Margin preferential
Ranked Pairs (Tideman), variante dei margini.
Copeland preferential
Il metodo di Copeland.
Dodgson Quick preferential
L’approssimazione polinomiale del metodo di Dodgson.
  • Una variante, un nome. Ogni variante è una scelta distinta, associata uno a uno al nome canonico della libreria: il metodo registrato si ripete tale e quale.
  • Solo metodi deterministici. Non è proposto alcun metodo non deterministico: le stesse schede danno sempre lo stesso risultato.
  • La ponderazione non è un metodo. Con weighted_voting si applica lo stesso metodo, ogni voto con il proprio peso, che la libreria conteggia nativamente.
  • I seggi sono un taglio. Gli eletti sono le prime seats posizioni della classifica restituita; nient’altro viene calcolato. I metodi proporzionali della libreria non sono proposti.
  • Metodi secondari, a titolo indicativo. Per un’elezione Condorcet, la pagina dei risultati può mostrare la classifica che gli altri metodi dell’elenco avrebbero prodotto con le stesse schede. Solo il metodo principale costituisce il risultato ufficiale.
I metodi Condorcet, spiegati
Parità

Nessuno spareggio inventato.

La piattaforma riporta ciò che restituisce la libreria e non ritocca mai il vincitore.

  • Ranghi condivisi. La classifica è numerata a partire da 1; i candidati a pari merito condividono lo stesso rango.
  • Cicli. In assenza di un vincitore di Condorcet, il ciclo è risolto dal metodo configurato, e soltanto da esso.
  • Parità al taglio dei seggi. Se una parità si trova a cavallo del confine tra la N-esima e la (N+1)-esima posizione, nessuno è dichiarato eletto oltre il confine. L’organizzatore decide al di fuori della piattaforma, di norma con un ballottaggio organizzato come una nuova elezione.
  • Nessuna scheda. Senza schede non c’è nulla da scrutinare: il risultato ufficiale è vuoto (conteggi a zero, classifica vuota, nessun eletto), senza ricorrere alla libreria.
Contratto di scrutinio

La versione del calcolo, registrata con il risultato.

Ogni risultato registra quanto serve per ripetere esattamente la stessa semantica: la versione del contratto di scrutinio, la versione della libreria e il metodo. La pagina pubblica dei risultati mostra il metodo e, per un’elezione Condorcet, la versione della libreria.

engine_contract_version intero · oggi 1
La versione del contratto di scrutinio (visualizzabile come « v1 »): la forma del documento di risultato e le regole di conteggio descritte in questa pagina.
condorcet_library_version stringa
La versione di julien-boudry/condorcet che ha calcolato il risultato (Condorcet::VERSION).
method stringa
Il nome canonico del metodo, così come lo riporta la libreria (Result->fromMethod).
counts, weights oggetti
I sei contatori qui sopra e il loro corrispettivo ponderato.

Il documento di risultato è conservato così come lo produce la libreria: per ogni metodo, la classifica, il vincitore e il perdente, il vincitore e il perdente di Condorcet, gli avvisi; facoltativamente, la matrice dei confronti a coppie. L’unica operazione aggiunta dalla piattaforma è il taglio delle prime seats posizioni.

Esportazione CEF

Una comodità, non un elemento del protocollo.

Concluso lo scrutinio e pubblicato il risultato, la pagina dei risultati offre le schede nel Condorcet Election Format (CEF), un formato testuale aperto con specifica pubblica, leggibile dalla libreria Condorcet come da qualsiasi implementazione conforme.

  • Mai necessario. Il documento si ricostruisce dal solo registro: un verificatore può rigenerarlo per confrontarlo con il file servito, e il riconteggio non ne ha bisogno.
  • Né vincoli né metodo. Non vi figurano: si leggono in ballot_rules e nel risultato pubblicati.
  • Rigenerato a ogni scrutinio. Prodotto dopo ogni scrutinio riuscito, anche per un’elezione senza schede; un nuovo scrutinio produce un nuovo documento. Non viene mai eliminato.
/elections/{election}/results/ballots.cef
Reindirizza al documento archiviato, una volta pubblicata l’elezione e concluso lo scrutinio.
Specifica del formato CEF

Contenuto del documento

#/Candidates: parametro
Le etichette ufficiali, dichiarate in apertura: un candidato che nessuno ha classificato esiste comunque.
#/Implicit Ranking: parametro
true per un’elezione preferential, false per un’elezione fptp.
#/Weight Allowed: parametro, solo ponderazione
Presente solo in un’elezione ponderata; ogni riga di voto reca allora il proprio peso firmato.
una riga per scheda classifica CEF
Il campo ballot di ogni payload pubblicato, scritto da cef-writer, schede bianche /EMPTY_RANKING/ comprese. Le schede nulle per formato non vi figurano.
Riconteggio indipendente

Ripetere lo scrutinio in autonomia.

Con la libreria di riferimento alla versione registrata, il riconteggio riproduce la classifica e i conteggi in modo identico. Qualsiasi altra implementazione conforme al CEF dovrebbe, in teoria, giungere allo stesso risultato.

  1. 1 Scarichi il registro dell’elezione e verifichi ogni scheda: firma, unicità delle immagini di chiave, coerenza con la lista elettorale e, in un’elezione ponderata, con i pesi.
  2. 2 Legga nel blocco 0 i candidati, il tipo, ballot_rules, seats e weighted_voting; ne deduca i vincoli e la regola di classifica implicita.
  3. 3 Scriva ogni payload pubblicato in CEF con cef-writer, oppure applichi lo stesso filtro di formato, con il suo peso firmato se l’elezione è ponderata; gli scarti sono le schede nulle per formato.
  4. 4 Calcoli con julien-boudry/condorcet, alla versione registrata, il metodo pubblicato con il risultato, con i vincoli dedotti, esentando la scheda bianca da NoTie e da CompleteRanking.
  5. 5 Confronti la classifica e i sei contatori con il risultato pubblicato, quindi legga gli eletti: le prime seats posizioni.