UNPKG

ecclesia

Version:

Framework for political and electoral simulations

51 lines (49 loc) 1.76 kB
import { Scores } from "./chunk-W6BKA6NW.js"; // src/election/attribution/scoreFactory.ts import { enumerate, max } from "@gouvernathor/python"; import { Counter, DefaultMap } from "@gouvernathor/python/collections"; import { fmean, median } from "@gouvernathor/python/statistics"; function averageScore({ nSeats }) { const attrib = (votes, rest = {}) => { const counts = new DefaultMap(() => []); for (const [party, grades] of votes) { for (const [grade, qty] of enumerate(grades)) { counts.get(party).push(...Array(qty).fill(grade)); } } return new Counter([[max(counts.keys(), (party) => fmean(counts.get(party))), nSeats]]); }; attrib.nSeats = nSeats; return attrib; } function medianScore({ nSeats, contingency }) { if (contingency === void 0) { contingency = averageScore({ nSeats }); } const attrib = (votes, rest = {}) => { const counts = new DefaultMap(() => []); for (const [party, grades] of votes) { for (const [grade, qty] of enumerate(grades)) { counts.get(party).push(...Array(qty).fill(grade)); } } const medians = new Map([...counts.entries()].map(([party, partigrades]) => [party, median(partigrades)])); const winScore = Math.max(...medians.values()); const [winner, ...winners] = [...medians.keys()].filter((p) => medians.get(p) === winScore); if (winners.length === 0) { return new Counter([[winner, nSeats]]); } winners.unshift(winner); const trimmedResults = Scores.fromEntries(winners.map((party) => [party, counts.get(party)])); return contingency(trimmedResults, rest); }; attrib.nSeats = nSeats; return attrib; } export { averageScore, medianScore }; //# sourceMappingURL=chunk-AM5WIXX2.js.map