Merge pull request #12 from MieuxVoter/feat-median-default-grade
Implement median default grade tallypull/14/head
commit
d542567cb3
@ -0,0 +1,50 @@
|
||||
package fr.mieuxvoter.mj;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Fill the missing judgments into the grade defined by `getDefaultGrade()`.
|
||||
* This is an abstract class to dry code between static default grade and median default grade.
|
||||
*/
|
||||
abstract public class DefaultGradeTally extends Tally implements TallyInterface {
|
||||
|
||||
/**
|
||||
* Override this to choose the default grade for a given proposal.
|
||||
*/
|
||||
abstract protected Integer getDefaultGradeForProposal(ProposalTallyInterface proposalTally);
|
||||
|
||||
// <domi41> /me is confused with why we need constructors in an abstract class?
|
||||
|
||||
public DefaultGradeTally(TallyInterface tally) {
|
||||
super(tally.getProposalsTallies(), tally.getAmountOfJudges());
|
||||
}
|
||||
|
||||
public DefaultGradeTally(ProposalTallyInterface[] proposalsTallies, Integer amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
}
|
||||
|
||||
public DefaultGradeTally(ProposalTallyInterface[] proposalsTallies, Long amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
}
|
||||
|
||||
public DefaultGradeTally(ProposalTallyInterface[] proposalsTallies, BigInteger amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
}
|
||||
|
||||
protected void fillWithDefaultGrade() {
|
||||
int amountOfProposals = getAmountOfProposals();
|
||||
for (int i = 0 ; i < amountOfProposals ; i++) {
|
||||
ProposalTallyInterface proposalTally = getProposalsTallies()[i];
|
||||
Integer defaultGrade = getDefaultGradeForProposal(proposalTally);
|
||||
BigInteger amountOfJudgments = proposalTally.getAmountOfJudgments();
|
||||
BigInteger missingAmount = this.amountOfJudges.subtract(amountOfJudgments);
|
||||
int missingSign = missingAmount.compareTo(BigInteger.ZERO);
|
||||
assert(0 <= missingSign); // ERROR: More judgments than judges!
|
||||
if (0 < missingSign) {
|
||||
BigInteger[] rawTally = proposalTally.getTally();
|
||||
rawTally[defaultGrade] = rawTally[defaultGrade].add(missingAmount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package fr.mieuxvoter.mj;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Fill the missing judgments into the median grade of each proposal.
|
||||
* Useful when the proposals have not received the exact same amount of votes and
|
||||
* the median grade is considered a sane default.
|
||||
*/
|
||||
public class MedianDefaultTally extends DefaultGradeTally implements TallyInterface {
|
||||
|
||||
public MedianDefaultTally(TallyInterface tally) {
|
||||
super(tally.getProposalsTallies(), tally.getAmountOfJudges());
|
||||
fillWithDefaultGrade();
|
||||
}
|
||||
|
||||
public MedianDefaultTally(ProposalTallyInterface[] proposalsTallies, BigInteger amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
fillWithDefaultGrade();
|
||||
}
|
||||
|
||||
public MedianDefaultTally(ProposalTallyInterface[] proposalsTallies, Long amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
fillWithDefaultGrade();
|
||||
}
|
||||
|
||||
public MedianDefaultTally(ProposalTallyInterface[] proposalsTallies, Integer amountOfJudges) {
|
||||
super(proposalsTallies, amountOfJudges);
|
||||
fillWithDefaultGrade();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Integer getDefaultGradeForProposal(ProposalTallyInterface proposalTally) {
|
||||
ProposalTallyAnalysis analysis = new ProposalTallyAnalysis(proposalTally);
|
||||
return analysis.getMedianGrade();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue