View Javadoc
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  }