1 package civitas.result;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.stereotype.Controller;
9
10 @Controller
11 public class CalculateWinnerList {
12 @Autowired
13 TransitiveClosure transitiveClosure;
14
15 @Autowired
16 InitialMatrix initialMatrix;
17
18 @Autowired
19 ComputeWinners computeWinners;
20
21 @Autowired
22 IsFullyIgnored isFullyIgnored;
23
24 public List<List<CandidateResult>> apply(final Integer[][] matrix, final String... candidates) {
25 int size = matrix.length;
26 CandidatePair[][] initial = initialMatrix.apply(matrix, size);
27 transitiveClosure.apply(initial, size);
28 Boolean[] ignore = new Boolean[size];
29 Arrays.fill(ignore, false);
30 List<List<CandidateResult>> winnerList = new ArrayList<>();
31 List<CandidateResult> lastWinners = new ArrayList<>();
32 while (!isFullyIgnored.apply(ignore)) {
33 List<Integer> winners = computeWinners.apply(initial, size, ignore);
34 List<CandidateResult> winningCandidates = new ArrayList<>();
35 for (Integer winner : winners) {
36 ignore[winner] = true;
37 winningCandidates.add(
38 new CandidateResult(winner, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), 1.0));
39 for (CandidateResult lastWinner : lastWinners) {
40 Integer i = lastWinner.candidate;
41 lastWinner.beatenCandidates.add(winner);
42 Integer beat = matrix[i][winner];
43 Integer beaten = matrix[winner][i];
44 lastWinner.beat.add(beat);
45 lastWinner.beaten.add(beaten);
46
47 int beatSize = lastWinner.beat.size();
48 lastWinner.strength = (lastWinner.strength * (beatSize - 1) + 1.0 * beat / beaten) / beatSize;
49 }
50 }
51 lastWinners = winningCandidates;
52 winnerList.add(winningCandidates);
53 }
54 return winnerList;
55 }
56 }