from otree.api import * import os from time import sleep import numpy as np import random import string doc = """ """ class C(BaseConstants): NUM_ROUNDS = 1 NAME_IN_URL = 'room_assignement' # JACKPOT = Currency(100) # GUESS_MAX = 100 N_CHAINS = 3 N_GENS = 2 PLAYERS_PER_GROUP = None grid_size = 8 PLAYERS_PER_TREATMENT = 2 n_letters = 8 n_trials = 10 #print(n_letters) letters = [string.ascii_uppercase[:8][i] for i in range(n_letters)] ## --------- DEFINE ROOM PREFERENCES AND REWARDS -------------- payoffs = [5*i for i in range(n_letters)] + [5*i for i in range(n_letters)] pref_rooms = {} np.random.seed(18) to_assign_ref = random.sample([i for i in range(n_letters)], n_letters) for i in range(n_letters): preferences = list(np.random.randint(0,50,n_letters)) # preferred = to_assign_ref[i] # print(letters[i]) # print(preferred) # preferences[preferred] = 30 pref_rooms[letters[i]] = preferences #print(pref_rooms) ## ------------ DEFINE NEIGHBORS PREFERENCES AND REWARDS ---------------- np.random.seed(3) i = np.random.randint(0,n_letters) j = i while i == j: j = np.random.randint(0,n_letters) k = np.random.randint(0,n_letters) l = k while k == l: l = np.random.randint(0,n_letters) pref_nb = [[letters[i], letters[j], 240], [letters[k], letters[l], 240]] shuffles = random.sample(letters, len(letters)) #print('shuf') #print(shuffles[0]) # pref_nb = [] # for i in range(int(n_letters) - 1): # pref_nb.append([shuffles[i], shuffles[i + 1], 100*(i+1)]) # pref_nb = [[shuffles[0], shuffles[1], 100 * i] for i in range(0,n_letters-1,2)] BEST_RULE = letters[k] + letters[l] BEST_RULE2 = letters[l] + letters[k] BEST_RULE3 = letters[i] + letters[j] BEST_RULE4 = letters[j] + letters[i] #print(pref_nb) MAX_SCORE = int(np.sum([np.max(v) for v in pref_rooms.values()])) + 600 #print(MAX_SCORE) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass def custom_export(players): # header row yield ['session', 'participant', 'treatment', 'chain_nb', 'generation', 'consent', 'age', 'gender', 'example1', 'example2', 'example3', 'rule_received', 'rule_transmitted', 'moves_performed', 'artifact_produced', 'score', 'perim_complexity', 'mean_complexity', 'visual_similarity', 'technical_pb', 'technical_details' ] for p in players: participant = p.participant session = p.session yield [p.session.id,p.participant.id, p.treatment, p.group.id_in_subsession, p.id_in_group, p.consent, p.age, p.gender, p.example1, p.example2, p.example3, [p.objective_rule1,p.objective_rule2,p.objective_rule3,p.objective_rule4], [p.transmitted_rule1,p.transmitted_rule2,p.transmitted_rule3,p.transmitted_rule4], p.moves, p.final_grid, p.score, p.perim_complex, p.mean_complex, p.VisualSimilarity, p.technical_pb, p.technical_details] def creating_session(subsession): #print(('---- new session ----') n_players = len(subsession.get_players()) subsession.session.chains = [[['open'] for i in range(C.PLAYERS_PER_TREATMENT )] for j in range(3)] subsession.session.treatment_counts = [0,0,0,0,0] subsession.session.open_spots = 0 #print(('OPENNN : ') #print((subsession.session.open_spots) subsession.session.indiv_learners = [[],[],[]] subsession.session.social_learners = [[],[],[],[],[]] #print((subsession.session.indiv_learners) class Player(BasePlayer): scores = models.StringField(initial = '') treatment = models.IntegerField() waiting = models.BooleanField(initial = True) payment = models.FloatField() has_finished = models.BooleanField(initial = False) has_dropped = models.BooleanField(initial = False) score = models.IntegerField() config = models.StringField(initial = '') transmitted_rule = models.StringField(intial = '--', choices = ['A must be next to B', 'B must be next to C', 'C must be next to D']); rule_received = models.StringField() solution_received = models.StringField() total_score = models.IntegerField(initial = 0) chain_nb = models.IntegerField() previous_indiv = models.IntegerField() position = models.IntegerField() age = models.IntegerField(min=18, choices = [i for i in range(18,100)]) gender = models.StringField(intial = '--', choices = ['Female', 'Male', 'Other', 'Prefer not to say']); age2 = models.IntegerField(label="Age", choices = [i for i in range(100,17,-1)]) gender2 = models.StringField(label="Gender", intial = '--', choices = ['Prefer not to say', 'Other', 'Male', 'Female']); consent = models.StringField() technical_pb = models.BooleanField() technical_details = models.StringField() # transmitted_rule = models.StringField() # PAGES class AttentionCheck(Page): form_model = 'player' form_fields = ['age2', 'gender2'] def live_method(player, data): if (data[0] == 'open' and player.has_dropped == False): treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' ##print(('dropped') player.has_dropped = True if player.id_in_group == 172 and 76 not in player.subsession.session.social_learners[4]: player.subsession.session.treatment_counts[4] -= 2 player.subsession.session.social_learners[4].append(76) player.subsession.session.social_learners[4].append(90) # player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 def vars_for_template(player: Player): return dict(age1 = player.age,gender1 = player.gender, has_dropped = player.has_dropped) def before_next_page(player,timeout_happened): if player.technical_pb == 1: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' ##print(('dropped') player.has_dropped = True ##print(('--- FINISHED ---') if player.treatment == 0: player.subsession.session.indiv_learners[1].append(player.id_in_group) player.subsession.session.indiv_learners[2].append(player.id_in_group) if player.treatment == 1: player.subsession.session.social_learners[3].append(player.id_in_group) if player.treatment == 2: player.subsession.session.social_learners[4].append(player.id_in_group) # player.subsession.session.open_spots += 1 player.participant.finished = True return True class Restart(Page): def vars_for_template(player: Player): return dict(round_nb = player.round_nb) def live_method(player, data): ##print(('restart') player.round_nb += 1 ##print((player.round_nb) class IntroductionP(Page): def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' ##print(('dropped') player.has_dropped = True player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 # def is_displayed(player : Player): # player.round_nb = player.round_number # return True # return player.session.config['treatment'] == 1 @staticmethod def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped, treatment = player.treatment) class IntroductionR(Page): def is_displayed(player : Player): return False return player.treatment == 2 @staticmethod def vars_for_template(player: Player): return dict(treatment = player.treatment) class IntroductionPR(Page): def is_displayed(player : Player): return False return player.treatment == 3 @staticmethod def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped, treatment = player.treatment) class WaitPage1(Page): @staticmethod def vars_for_template(player : Player): return dict(has_dropped = player.has_dropped, has_finished= str(player.field_maybe_none('has_finished'))) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' ##print(('dropped') player.has_dropped = True @staticmethod def is_displayed(player): if player.subsession.session.code == 'sw6nm4il': if player.group.get_player_by_id(1).waiting == 1: player.subsession.session.treatment_counts[1] = 9 player.subsession.session.treatment_counts[3] = 9 player.subsession.session.indiv_learners[1] = [8] player.group.get_player_by_id(1).waiting = 0 if player.subsession.session.code == '5ocgiog4': if player.group.get_player_by_id(1).waiting == 1: player.subsession.session.treatment_counts[4] = 29 player.subsession.session.treatment_counts[3] = 29 player.subsession.session.social_learners[3] = [77] player.subsession.session.social_learners[4] = [51] player.group.get_player_by_id(1).waiting = 0 # if player.subsession.session.treatment_counts[1] == 10 and 16 in player.subsession.session.indiv_learners[1]: # player.subsession.session.treatment_counts[1] = 9 #t1 = [id for id in player.session.indiv_learners[1]] #t2 =[id for id in player.session.indiv_learners[2]] #player.session.indiv_learners = [[], t1, t2 ] # if len(player.session.indiv_learners) != 3: # player.session.indiv_learners = [[], player.session.indiv_learners, player.session.indiv_learners] ##print(('OPEN') ##print((player.subsession.session.open_spots) if player.field_maybe_none("previous_indiv") != None: return False if player.field_maybe_none("treatment") == None: ##print((player.subsession.session.treatment_counts) if player.subsession.session.treatment_counts[0] < player.subsession.session.config['participants_per_treatment']: # Still recruiting asocial learners player.treatment = 0 player.subsession.session.treatment_counts[0] += 1 ##print(('INDIV') #player.chain_nb = player.subsession.session.treatment_counts[player.treatment] return False elif player.subsession.session.treatment_counts[1] < player.subsession.session.config['participants_per_treatment'] or player.subsession.session.treatment_counts[2] < player.subsession.session.config['participants_per_treatment'] : # Recruiting Social learners if player.subsession.session.treatment_counts[2] < player.subsession.session.treatment_counts[1]: player.treatment = 2 else: player.treatment = 1 player.subsession.session.treatment_counts[player.treatment] += 1 if len(player.subsession.session.indiv_learners[player.treatment]) < 1: return True player.previous_indiv = player.subsession.session.indiv_learners[player.treatment].pop() ##print(("-----COUNT1 : ") ##print((player.subsession.session.treatment_counts) ##print(("-----COUNT2 : ") ##print((player.subsession.session.treatment_counts) # player.chain_nb = player.subsession.session.treatment_counts[player.treatment] # ##print(('???------') return False else: #Rescruting third generation if player.subsession.session.treatment_counts[4] < player.subsession.session.treatment_counts[3]: player.treatment = 4 else: player.treatment = 3 player.subsession.session.treatment_counts[player.treatment] += 1 if len(player.subsession.session.social_learners[player.treatment]) < 1: return True player.previous_indiv = player.subsession.session.social_learners[player.treatment].pop() # player.chain_nb = player.subsession.session.treatment_counts[player.treatment] # ##print(('???------') return False # if len(player.subsession.session.indiv_learners) < player.subsession.session.treatment_counts[player.treatment]: # ##print(('TRUE------') # ##print((len(player.subsession.session.indiv_learners)) # ##print((player.subsession.session.treatment_counts[player.treatment]) # return True # else: # # return False # player.treatment = 1 # # treatment = player.treatment # ##print((treatment) # session = player.subsession.session # ##print((session.chains) # for i in range(len(session.chains[treatment - 1])): # # if session.chains[treatment - 1][i][-1] == 'open' and player.waiting: # player.chain_nb = i # player.position = len(session.chains[treatment - 1][i]) - 1 # session.chains[treatment - 1][i][-1] = 'closed' # player.waiting = False # return False # for i in range(len(session.chains[2 - treatment])): # # if session.chains[2 - treatment][i][-1] == 'open' and player.waiting: # player.chain_nb = i # player.position = len(session.chains[2 - treatment][i]) - 1 # session.chains[2 - treatment][i][-1] = 'closed' # player.waiting = False # if treatment == 1: # player.treatment = 2 # else: # player.treatment = 1 # # return False # # #session.chains.append[['open']] # #return False else: if player.treatment == 1 or player.treatment == 2: if len(player.subsession.session.indiv_learners[player.treatment]) < 1: return True ##print((player.subsession.session.indiv_learners) player.previous_indiv = player.subsession.session.indiv_learners[player.treatment].pop() player.subsession.session.treatment_counts[player.treatment] += 1 # player.chain_nb = player.subsession.session.treatment_counts[player.treatment] # ##print(('???------') return False if player.treatment == 3 or player.treatment == 4: if len(player.subsession.session.social_learners[player.treatment]) < 1: return True ##print((player.subsession.session.social_learners) player.previous_indiv = player.subsession.session.social_learners[player.treatment].pop() player.subsession.session.treatment_counts[player.treatment] += 1 # player.chain_nb = player.subsession.session.treatment_counts[player.treatment] # ##print(('???------') return False # if len(player.subsession.session.indiv_learners) < player.chain_nb: # ##print(('TRUE------') # ##print((len(player.subsession.session.indiv_learners)) # #print((player.subsession.session.treatment_counts[player.treatment]) # return True # else: # # return False # class task1(Page): # # # # @staticmethod # def vars_for_template(player: Player): # # player.participant.NEW_OBJ = [] # with open('guess_two_thirds/grid_obj.txt', encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # # group = player.group # # return dict(rule=C.rule, new_obj=player.participant.NEW_OBJ) # # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # player.group.rule_tr = '' # # class transmission_phase1(Page): # form_model = 'group' # form_fields = ['rule_tr'] class observation_phase(Page): def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 @staticmethod def is_displayed(player: Player): return player.treatment != 3 @staticmethod def vars_for_template(player: Player): # player.participant.NEW_OBJ = [] # try: # name = 'OBJ' + str(player.group.round_number - 1) + '.txt' # # with open('/Users/jeremyperez/Downloads/' + name, encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # except: treatment = player.treatment if player.position == 0: examples = [] ##print(('EXCPET') for i in range(3): # with open('CopyTheStyle/example'+str(i)+'.txt', encoding='utf-8') as file: with open('CopyTheStyle/ex'+str(i%3 +1)+'_12.txt', encoding='utf-8') as file: ex = '' for line in file: str_list = line.split() int_list = list(map(int, str_list)) ex += str(line[:-1]) + ' ' examples.append(ex) player.example1, player.example2, player.example3 = examples if treatment != 1: #print(('---------DIFF 1 - ----------') player.objective_rule1 = C.rule1 player.objective_rule2 = C.rule2 player.objective_rule3 = C.rule3 player.objective_rule4 = C.rule4 else: # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # #print((prev_player.round_nb) # prev_player = prev_player.in_round(prev_player.round_nb) #print((player.session.chains) #print((player.session.chains[treatment - 1][player.chain_nb]) #print((player.chain_nb) #print((player.treatment) prev_player_id = player.session.chains[treatment - 1][player.chain_nb][player.position - 1] prev_player = player.group.get_player_by_id(prev_player_id) examples = [prev_player.example2,prev_player.example3, prev_player.final_grid] player.example1, player.example2, player.example3 = examples if treatment != 1: player.objective_rule1 = prev_player.transmitted_rule1 player.objective_rule2 = prev_player.transmitted_rule2 player.objective_rule3 = prev_player.transmitted_rule3 player.objective_rule4 = prev_player.transmitted_rule4 return dict(has_dropped = player.has_dropped, rules=[player.field_maybe_none('objective_rule1'), player.field_maybe_none('objective_rule2'),player.field_maybe_none('objective_rule3'),player.field_maybe_none('objective_rule4')], examples=[player.field_maybe_none('example1'),player.field_maybe_none('example2'), player.field_maybe_none('example3')] , treatment = player.treatment) # # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # # if player.session.config['treatment'] != 1: # return dict(rule=prev_player.participant.RULE, new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # return dict(new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) class task1(Page): # timeout_seconds = 300 @staticmethod def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 if data[0] == 'undo': player.moves += ' undo;' if data[0] == 'move': player.moves += ' '.join(map(str, data[1])) + ';' elif data[0] == 'grid': player.final_grid = '' for line in data[1]: player.final_grid += ' '.join(map(str, line)) + ' ' # return {player.id_in_group: [player.final_grid] } # return {player.id_in_group: ''} @staticmethod def vars_for_template(player: Player): treatment = player.treatment if player.position == 0: examples = [] ##print(('EXCPET') for i in range(3): # with open('CopyTheStyle/example'+str(i)+'.txt', encoding='utf-8') as file: with open('CopyTheStyle/ex'+str(i%3 +1)+'_12.txt', encoding='utf-8') as file: ex = '' for line in file: str_list = line.split() int_list = list(map(int, str_list)) ex += str(line[:-1]) + ' ' examples.append(ex) player.example1, player.example2, player.example3 = examples if treatment != 1: #print(('---------DIFF 1 - ----------') player.objective_rule1 = C.rule1 player.objective_rule2 = C.rule2 player.objective_rule3 = C.rule3 player.objective_rule4 = C.rule4 else: # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # #print((prev_player.round_nb) # prev_player = prev_player.in_round(prev_player.round_nb) prev_player_id = player.session.chains[treatment - 1][player.chain_nb][player.position - 1] prev_player = player.group.get_player_by_id(prev_player_id) examples = [prev_player.example2,prev_player.example3, prev_player.final_grid] player.example1, player.example2, player.example3 = examples if treatment != 1: player.objective_rule1 = prev_player.transmitted_rule1 player.objective_rule2 = prev_player.transmitted_rule2 player.objective_rule3 = prev_player.transmitted_rule3 player.objective_rule4 = prev_player.transmitted_rule4 return dict(has_dropped = player.has_dropped, final_grid = player.final_grid, rules=[player.field_maybe_none('objective_rule1'), player.field_maybe_none('objective_rule2'),player.field_maybe_none('objective_rule3'),player.field_maybe_none('objective_rule4') ], new_obj=player.field_maybe_none('objective_grid'), treatment = player.treatment) # # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # # if player.session.config['treatment'] != 1: # return dict(rule=prev_player.participant.RULE, new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # return dict(new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # sleep(0.1) # if player.session.config['treatment'] != 2: # # player.participant.NEW_OBJ = [] # name = 'OBJ' + str(player.group.round_number) + '.txt' # # with open('/Users/jeremyperez/Downloads/' + name, encoding='utf-8') as file: # for txt in file: # lines = txt.split('],[') # for line in lines: # if line[0] == '[': # line = line[2:] # elif line[-1] == ']': # line = line[:-2] # # str_list = line.split(',') # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # #print(('new_obj') # #print((player.participant.NEW_OBJ) # # @staticmethod # def is_displayed(player: Player): # return player.round_number == player.id_in_group # def compareRules(rules1,rules2): diff = 0 for i in range(len(rules1.split(';'))): if rules1.split(';')[i] != rules2.split(';')[i]: diff+=1 return diff class transmission_phase2(Page): # form_model = 'player' # form_fields = ['transmitted_rule'] def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 if data[0] == 'rules': player.transmitted_rule1 = ';'.join(data[1][0]) player.transmitted_rule2 = ';'.join(data[1][1]) player.transmitted_rule3 = ';'.join(data[1][2]) player.transmitted_rule4 = ';'.join(data[1][3]) #print(('tr : --------') #print((player.transmitted_rule1) #print((player.transmitted_rule2) #print((player.transmitted_rule3) #print((player.transmitted_rule4) mut1a = compareRules(player.objective_rule1,player.transmitted_rule1 ) + compareRules(player.objective_rule2,player.transmitted_rule2 ) mut1b = compareRules(player.objective_rule1,player.transmitted_rule2 ) + compareRules(player.objective_rule2,player.transmitted_rule1 ) mut1 = np.min([mut1a, mut1b]) mut2a = compareRules(player.objective_rule3,player.transmitted_rule3 ) + compareRules(player.objective_rule4,player.transmitted_rule4 ) mut2b = compareRules(player.objective_rule3,player.transmitted_rule4 ) + compareRules(player.objective_rule4,player.transmitted_rule3 ) mut2 = np.min([mut2a, mut2b]) n_mut = mut1 + mut2 # i = 0 # if ((player.objective_rule1 == player.transmitted_rule1 and player.objective_rule2 == player.transmitted_rule2) or (player.objective_rule1 == player.transmitted_rule2 and player.objective_rule2 == player.transmitted_rule1)) and ((player.objective_rule3 == player.transmitted_rule3 and player.objective_rule4 == player.transmitted_rule4) or (player.objective_rule3 == player.transmitted_rule4 and player.objective_rule4 == player.transmitted_rule3)) # for rule_obj in [player.objective_rule1,player.objective_rule2,player.objective_rule3,player.objective_rule4]: # j = 0 # for r in rule_obj.split(';'): # if r != data[1][i][j]: # n_mut += 1 # j+=1 # i+= 1 #print(('Mutations : ') #print((n_mut) player.mutations = int(n_mut) def is_displayed(player : Player): return player.treatment != 1 # # @staticmethod # def is_displayed(player: Player): # #print(('rule:') # #print((player.group.field_maybe_none('rule_tr')) # if player.group.field_maybe_none('rule_tr') != None: # player.participant.RULE = player.group.field_maybe_none('rule_tr') # # # return player.round_number == player.id_in_group and player.session.config['treatment'] != 1 # # class WaitPage1(WaitPage): # pass # # @staticmethod # # def is_displayed(player: Player): # # return player.round_number == player.id_in_group # # class task2(Page): # # # # def vars_for_template(player: Player): # # others = player.get_others_in_group() # # for p in others: # # if p.id == player.id - 1: # # player.participant.NEW_OBJ = p.participant.NEW_OBJ # # return dict(rule=player.group.rule_tr, new_obj=player.participant.NEW_OBJ) # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # player.group.rule_tr = '' # # @staticmethod # # def is_displayed(player: Player): # # return player.id_in_group == 2 class Results2(Page): def live_method(player, data): #print((data[0]) if data[0] == 'open' : if player.has_dropped == False: treatment = player.treatment player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') #print((player.session.chains) player.has_dropped = True player.subsession.session.players_per_treatment[player.treatment - 1] -= 1 if data[0] == 'payment': player.payment = str(data[1]) if data[0] == 'score': player.score = str(data[1]) #print((data[1]) elif data[0] == 'simi': player.VisualSimilarity = str(data[1]) #print((data[1]) elif data[0] == 'mean_complex': player.mean_complex = str(data[1]) #print((data[1]) elif data[0] == 'set': def get_same_neighbours(M,x,y, excluded1 = []): M = np.array(M) color = M[x,y] if color == 0: return [] neigb= [] if y > 0 : if M[x,y-1] == color and (x, y-1) not in excluded1: neigb.append((x,y-1)) if x > 0 : if M[x-1,y] == color and (x-1, y) not in excluded1: neigb.append((x-1,y)) if x < (len(M)-1) : if M[x+1,y] == color and (x+1, y) not in excluded1: neigb.append((x+1,y)) if y < (len(M)-1): if M[x,y+1] == color and (x, y+1) not in excluded1: neigb.append((x,y+1)) return neigb def get_perimetric_complexity(M): M = np.array(M) clusters = get_clusters(np.array(M)) perim_complex = [] for cluster in clusters: perim = 0 area = 0 for dot in cluster: area +=1 x,y = dot perim += 4 - len(get_same_neighbours(M,x,y)) #if perim**2 / (4 * area) == 4.5: #print((cluster) #print((M[cluster[0][0], cluster[0][1]]) perim_complex.append(perim**2 / ( area)) Pmax = 104 * (4**2 / (1)) Pmin = 2 * (17**2 / (52)) # Pmin = 0 # Pmax = 1 #print(('PMAX') #print((Pmax) #print(('PMIN') #print((Pmin) #print((np.sum(perim_complex)) #print(('this') #print((perim_complex) #print(((np.sum(perim_complex) - Pmin)/(Pmax - Pmin)) #print(('that') return (np.sum(perim_complex) - Pmin)/(Pmax - Pmin) def get_cluster(M, x,y, excluded2 = []): M = np.array(M) if M[x,y] == 0: return excluded2.append((x,y)) cluster = [[x,y]] neigb = get_same_neighbours(M,x,y, excluded2) if len(neigb) == 0: ##print(("end") return cluster, excluded2 for n in neigb: ##print(("here") x,y = n[0], n[1] excluded2.append((x,y)) cluster+= get_cluster(M,x,y, excluded2)[0] clean_cluster = [] for couple in cluster: if couple not in clean_cluster: clean_cluster.append(couple) return clean_cluster, excluded2 def get_clusters(M): M = np.array(M) excluded = [] clusters = [] for x in range(len(M)): for y in range(len(M[0])): if (x,y) not in excluded and M[x,y] != 0 and M[x,y] != '0': ##print((self.get_cluster(x,y)) c, exclu = get_cluster(M,x,y, []) excluded += exclu clusters.append(c) ##print((clusters) return clusters #print(('received') M, id = data[1:] perim_complex = get_perimetric_complexity(M) if id == 'div2': player.perim_complex = str(perim_complex) #print(('COMPLEXITY : ') #print((player.perim_complex) #print((perim_complex) #print((str(perim_complex)) return {player.id_in_group: [perim_complex, id]} def vars_for_template(player: Player): player.has_finished = True #print(('from res : ') #print((player.has_finished) player.objective_grid = "" ##print(('EXCPET') # with open('CopyTheStyle/NEW_RULE_OBJ.txt', encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # #print((line) # player.objective_grid += str(line[:-1]) + ' ' # #print((player.objective_grid) return dict( has_dropped = player.has_dropped, mutations = player.field_maybe_none('mutations'), examples=[player.field_maybe_none('example1'),player.field_maybe_none('example2'), player.field_maybe_none('example3'), ], rule_obj = [player.field_maybe_none('objective_rule1'),player.field_maybe_none('objective_rule2'),player.field_maybe_none('objective_rule3'),player.field_maybe_none('objective_rule4'),], rule_tr = [player.field_maybe_none('transmitted_rule1'),player.field_maybe_none('transmitted_rule2'),player.field_maybe_none('transmitted_rule3'),player.field_maybe_none('transmitted_rule4'),], final=player.field_maybe_none('final_grid'), obj=player.field_maybe_none('objective_grid'), treatment = player.treatment) # class transmission_phase2(Page): # form_model = 'group' # form_fields = ['rule_tr'] # # @staticmethod class Information(Page): def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped) @staticmethod def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True else: player.consent = data class ConsentForm(Page): pass class AgeGenderForm(Page): form_model = 'player' form_fields = ['age', 'gender'] def vars_for_template(player: Player): #print((player.subsession.session.indiv_learners) return dict(has_dropped = player.has_dropped) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True player.gender = data; class finish(Page): def is_displayed(player: Player): return True # @staticmethod # def is_displayed(player: Player): # # #print(('--- FINISHED ---') # session = player.subsession.session # session.chains[player.treatment - 1][player.chain_nb][player.position] = player.id_in_subsession # if player.position < C.N_GENS - 1: # #print(('--- OPEN ---') # player.subsession.session.chains[player.treatment - 1][player.chain_nb].append('open') # # player.participant.finished = True # # #print((player.subsession.session.chains) # return True # class ResultsWaitPage(WaitPage): # after_all_players_arrive = set_payoffs class TechnicalPb(Page): def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True #print((data) if data[0] == 'check': player.technical_pb = data[1] elif data[0] == 'details': player.technical_details = data[1] def get_score(config): score = 0 for i in range(len(config)): pass score += C.pref_rooms[config[i]][i] indiv_string = room_to_indiv_string(C.n_letters, config) for constraint in C.pref_nb: letter1, letter2, payoff = constraint i = ord(letter1) - 65 j = ord(letter2) - 65 if legal(indiv_string, [i,j,'n'], C.n_letters): score += payoff return score def legal(string, constraint, n_rooms): i,j,r = constraint room1 = int(string[i]) room2 = int(string[j]) if r == 'n': if room1 == room2 + 1 or room1 == room2 - 1 or (room1 == 0 and room2 == n_rooms - 1) or (room2 == 0 and room1 == n_rooms - 1): return True else: return False if r == 'nn': if room1 == room2 + 1 or room1 == room2 - 1 or (room1 == 0 and room2 == n_rooms - 1) or (room2 == 0 and room1 == n_rooms - 1): return False else: return True if r == 's': if room1 == room2: return True else: return False if r == 'ns': if room1 == room2: return False else: return True def check_constraints(string, constraints, n_room): n = 0 for c in constraints: if legal(string, c, n_room): n +=1 return n def indiv_to_room_array(n_room, indiv_string): rooms = [[] for i in range(n_room)] for i in range(len(indiv_string)): letter = string.ascii_uppercase[i] rooms[int(indiv_string[i])].append(letter) return rooms def room_to_indiv_string(n_indiv, room_array): indiv_string = [0 for i in range(n_indiv)] for i in range(len(room_array)): room = room_array[i] for letter in room: indiv_string[ord(letter) - 65] = str(i) return ''.join(indiv_string) class new_task(Page): def vars_for_template(player: Player): treatment = player.treatment if player.treatment == 0: prev_solution = None prev_rule = None if player.treatment > 0 : prev_player_id = player.previous_indiv #prev_player_id = player.subsession.session.indiv_learners[player.chain_nb - 1] # prev_player_id = player.session.chains[treatment - 1][player.chain_nb][player.position - 1] prev_player = player.group.get_player_by_id(prev_player_id) prev_solution = prev_player.config.split(',')[-1] prev_rule = prev_player.transmitted_rule player.rule_received = prev_rule player.solution_received = prev_solution return dict( total_score = player.total_score, has_dropped = player.has_dropped, configs = player.config, scores = player.scores, prev_solution = prev_solution, prev_rule = prev_rule, treatment = player.treatment) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True if data[0] == 'configs': # str(player.field_maybe_none('config')) player.config += ','+ ''.join(data[1]) #print((player.config) try: score = get_score(data[1]) except: score = 'Error' player.score = int(score) player.scores += ',' + str(score) #print((player.scores.split(',')) if len(player.scores.split(',')) > C.n_trials + 1: player.total_score += 3 * int(score) #print(('3X') else: player.total_score += int(score) return {player.id_in_group: ['score', int(score)]} class transmission(Page): def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True if data[0] == 'rule': player.transmitted_rule = data[1] + data[2] #print((player.transmitted_rule) # form_model = 'player' # form_fields = ['transmitted_rule'] def vars_for_template(player : Player): return dict(configs = player.config, has_dropped = player.has_dropped, scores = player.scores) class Results3(Page): def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True def vars_for_template(player: Player): player.payment = round(player.total_score / (C.n_trials * C.MAX_SCORE), 2) correct = False if player.field_maybe_none('transmitted_rule') == None: ## ERROR IN RECORDING THE RULE --> DROP OUT : treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True correct = True #else: if player.transmitted_rule == C.BEST_RULE or player.transmitted_rule == C.BEST_RULE2 or player.transmitted_rule == C.BEST_RULE3 or player.transmitted_rule == C.BEST_RULE4 : correct = True player.payment += 0.25 #print(('pay') #print((player.total_score / (C.n_trials * C.MAX_SCORE)) return dict(payment = player.payment, has_dropped = player.has_dropped, correct = correct, total_score = player.total_score) class Instructions(Page): def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True def vars_for_template(player: Player): return dict(treatment = player.treatment, has_dropped = player.has_dropped) class ComprehensionTest(Page): def vars_for_template(player: Player): return dict(has_dropped = player.has_dropped) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True class BonusTrial(Page): def vars_for_template(player: Player): treatment = player.treatment if player.treatment == 0: prev_solution = None prev_rule = None if player.treatment > 0 : prev_player_id = player.previous_indiv #prev_player_id = player.subsession.session.indiv_learners[player.chain_nb - 1] # prev_player_id = player.session.chains[treatment - 1][player.chain_nb][player.position - 1] prev_player = player.group.get_player_by_id(prev_player_id) prev_solution = prev_player.config.split(',')[-1] prev_rule = prev_player.transmitted_rule player.rule_received = prev_rule player.solution_received = prev_solution return dict( total_score = player.total_score, has_dropped = player.has_dropped, configs = player.config, scores = player.scores, prev_solution = prev_solution, prev_rule = prev_rule, treatment = player.treatment) def live_method(player, data): if data[0] == 'open' and player.has_dropped == False: treatment = player.treatment player.subsession.session.treatment_counts[treatment] -= 1 if treatment == 1 or treatment == 2: player.subsession.session.indiv_learners[treatment].append(player.previous_indiv) if treatment == 3 or treatment == 4: player.subsession.session.social_learners[treatment].append(player.previous_indiv) # player.session.chains[treatment - 1][player.chain_nb][player.position] = 'open' #print(('dropped') player.has_dropped = True if data[0] == 'configs': # str(player.field_maybe_none('config')) player.config += ','+ ''.join(data[1]) #print((player.config) try: score = get_score(data[1]) except: score = 'Error' player.score = int(score) player.scores += ',' + str(score) #print((player.scores.split(',')) if len(player.scores.split(',')) > C.n_trials: player.total_score += 3 * int(score) #print(('3X') else: player.total_score += int(score) return {player.id_in_group: ['score', int(score)]} page_sequence = [WaitPage1,Information,AgeGenderForm, Instructions,ComprehensionTest, new_task, transmission, BonusTrial, TechnicalPb, AttentionCheck, Results3, finish] #page_sequence = [WaitPage1, Information, AgeGenderForm, IntroductionP, observation_phase, task1, transmission_phase2, Results, TechnicalPb, AttentionCheck, finish, Restart] # IntroductionP, IntroductionR, IntroductionPR, # , Results]