-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata_generation.py
66 lines (58 loc) · 2.12 KB
/
data_generation.py
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
from itertools import product
import random
import dill
import numpy as np
# Returns True or False depending on whether the preference given in input satisfies
# transitivity or not
def check_transitivity(pref):
for k in range(0, len(pref)):
for q in range(0, len(pref)):
for r in range(0, len(pref)):
if pref[k][q] == 1 and pref[q][r] == 1:
if pref[k][r] != 1:
return False
return True
# Returns a symmetric version of the preference given in input
def fix_symmetry_diagonal(pref):
fixed_pref = pref
for q in range(0, len(pref)):
for j in range(0, len(pref)):
if j > q:
fixed_pref[q][j] = -pref[j][q]
elif j == q:
fixed_pref[q][j] = 0
return fixed_pref
# Randomly generates incomplete preference with alt_number alternatives
def generate_incomplete_random_preference(alt_number):
random_pref = np.random.randint(-1, 2, (alt_number, alt_number))
some_pref = fix_symmetry_diagonal(random_pref)
while not check_transitivity(some_pref):
random_pref = np.random.randint(-1, 2, (alt_number, alt_number))
some_pref = fix_symmetry_diagonal(random_pref)
return some_pref
# Randomly generates a profile of incomplete preferences with n voters and m alternatives
def profile_generation(n, m):
vot_number = n
alt_number = m
profile = []
for _ in range(vot_number):
some_pref = generate_incomplete_random_preference(alt_number)
profile.append(some_pref)
return profile
# Generates all incomplete preferences with numAlts alternatives by looping through all possible
# completions of the triangle below the diagonal in the matrix representing the preferences
def getAllBallots(numAlts):
lenLowerDiagonal = int(numAlts * (numAlts - 1) / 2)
for lowerDiagonal in product([-1, 0, 1], repeat = lenLowerDiagonal):
ballot = np.zeros((numAlts, numAlts))
k = 0
for i in range(numAlts):
for j in range(i):
ballot[i][j] = lowerDiagonal[k]
k += 1
ballot = fix_symmetry_diagonal(ballot)
if check_transitivity(ballot):
yield ballot
# Returns all the profiles with numVoters voters and numAlts alternatives
def getAllProfiles(numVoters, numAlts):
return product(getAllBallots(numAlts), repeat = numVoters)