ecclesia
Version:
Framework for political and electoral simulations
51 lines (49 loc) • 1.76 kB
JavaScript
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