-
Notifications
You must be signed in to change notification settings - Fork 540
Expand file tree
/
Copy pathmain.py
More file actions
113 lines (91 loc) · 3.73 KB
/
Copy pathmain.py
File metadata and controls
113 lines (91 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from nada_dsl import *
def initialize_managers(nr_managers):
"""
Initialize managers with unique identifiers.
Parameters:
- nr_managers (int): Number of managers.
Returns:
- managers (list): List of Party objects representing managers.
"""
managers = []
for i in range(nr_managers):
managers.append(Party(name="Manager" + str(i)))
return managers
def inputs_initialization(nr_managers, nr_employees, managers):
"""
Initialize inputs for performance scores per employee.
Parameters:
- nr_managers (int): Number of managers.
- nr_employees (int): Number of employees.
Returns:
- scores_per_employee (list): List of lists representing scores per employee.
"""
scores_per_employee = []
for e in range(nr_employees):
scores_per_employee.append([])
for m in range(nr_managers):
scores_per_employee[e].append(
SecretUnsignedInteger(
Input(name="m" + str(m) + "_e" + str(e), party=managers[m])
)
)
return scores_per_employee
def compute_average_scores(nr_managers, nr_employees, scores_per_employee, outparty):
"""
Compute the average scores for each employee.
Parameters:
- nr_managers (int): Number of managers.
- nr_employees (int): Number of employees.
- scores_per_employee (list): List of lists representing scores per employee.
Returns:
- avg_scores (list): List of Output objects representing average scores for each employee.
"""
avg_scores = []
for e in range(nr_employees):
total_score = scores_per_employee[e][0]
for m in range(1, nr_managers):
total_score += scores_per_employee[e][m]
average_score = total_score / UnsignedInteger(nr_managers)
avg_scores.append(Output(average_score, "avg_score_e" + str(e), outparty))
return avg_scores
def verify_scores(nr_managers, nr_employees, scores_per_employee, max_score, outparty):
"""
Check if any score exceeds the allowed maximum score.
Parameters:
- nr_managers (int): Number of managers.
- nr_employees (int): Number of employees.
- scores_per_employee (list): List of lists representing scores per employee.
Returns:
- score_checks (list): List of Output objects representing score checks for each employee.
- if_cheat_open (list): List of Output objects representing revealed scores of cheating managers.
"""
score_checks = []
if_cheat_open = []
for e in range(nr_employees):
for m in range(nr_managers):
score = scores_per_employee[e][m]
check = score <= UnsignedInteger(max_score)
score_checks.append(Output(check, "check_score_m" + str(m) + "_e" + str(e), outparty))
reveal_cheat = check.if_else(UnsignedInteger(0), score)
if_cheat_open.append(Output(reveal_cheat, "if_cheat_open_m" + str(m) + "_e" + str(e), outparty))
return score_checks, if_cheat_open
def nada_main():
# Compiled-time constants
nr_managers = 3
nr_employees = 2
max_score = 10 # Example maximum score allowed
# Parties initialization
managers = initialize_managers(nr_managers)
outparty = Party(name="OutParty")
# Inputs initialization
scores_per_employee = inputs_initialization(nr_managers, nr_employees, managers)
# Computation
# Compute average scores
avg_scores = compute_average_scores(nr_managers, nr_employees, scores_per_employee, outparty)
# Check score validity
score_checks, if_cheat_open = verify_scores(nr_managers, nr_employees, scores_per_employee, max_score, outparty)
# Output
results = avg_scores + score_checks + if_cheat_open
return results
# Run the main function
nada_main()