|
|
|
extends Resource
|
|
|
|
class_name MajorityJudgmentCandidateMeritProfile
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
The merit profile of a candidate is obtained
|
|
|
|
by putting on a single line the judgments they received,
|
|
|
|
sorted by increasing (or decreasing) grade.
|
|
|
|
|
|
|
|
This is built by the Talliers.
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
export(Resource) var candidate_tally #:MajorityJudgmentCandidateTally
|
|
|
|
|
|
|
|
|
|
|
|
# For each grade (worst to best), the amount of judgments received
|
|
|
|
export(Array, int) var grades
|
|
|
|
|
|
|
|
export(Array, Color) var colors
|
|
|
|
|
|
|
|
#export(int) var grades_amount
|
|
|
|
|
|
|
|
|
|
|
|
func count_judgments() -> int:
|
|
|
|
var amount := 0
|
|
|
|
for amount_for_grade in self.grades:
|
|
|
|
amount += amount_for_grade
|
|
|
|
return amount
|
|
|
|
|
|
|
|
|
|
|
|
func count_grades_with_judgments() -> int:
|
|
|
|
var amount := 0
|
|
|
|
for amount_for_grade in self.grades:
|
|
|
|
if amount_for_grade:
|
|
|
|
amount += 1
|
|
|
|
return amount
|
|
|
|
|
|
|
|
|
|
|
|
func get_median() -> int:
|
|
|
|
"""
|
|
|
|
Returns the grade index, not a Grade instance.
|
|
|
|
0 = worst grade (most conservative?)
|
|
|
|
|
|
|
|
Returns -1 if there are no judgments.
|
|
|
|
"""
|
|
|
|
assert(self.grades)
|
|
|
|
var total := count_judgments()
|
|
|
|
if 0 == total:
|
|
|
|
return -1
|
|
|
|
|
|
|
|
var middle := 0
|
|
|
|
if 0 == total % 2: # total is even
|
|
|
|
middle = total / 2
|
|
|
|
else: # total is odd
|
|
|
|
middle = (total + 1) / 2
|
|
|
|
assert(middle > 0)
|
|
|
|
|
|
|
|
var amount := 0
|
|
|
|
|
|
|
|
for i in range(self.grades.size()):
|
|
|
|
assert(0 <= self.grades[i], "Negative grade amount… What? Cheater!")
|
|
|
|
amount += self.grades[i]
|
|
|
|
if amount >= middle:
|
|
|
|
return i
|
|
|
|
|
|
|
|
assert(false, "That should not happen")
|
|
|
|
return -1
|
|
|
|
|
|
|
|
|
|
|
|
func remove_one_judgment(grade_index:int) -> void:
|
|
|
|
"""
|
|
|
|
Used by the naive sorting algorithm, that works on a copy.
|
|
|
|
"""
|
|
|
|
assert(0 < self.grades[grade_index])
|
|
|
|
self.grades[grade_index] -= 1
|
|
|
|
|
|
|
|
|
|
|
|
func get_color_of_grade(grade_index:int) -> Color:
|
|
|
|
if self.colors:
|
|
|
|
return self.colors[grade_index]
|
|
|
|
if self.candidate_tally and self.candidate_tally.poll:
|
|
|
|
return self.candidate_tally.poll.grading.get_color_of_grade(grade_index)
|
|
|
|
return Color.blue
|