from otree.api import * import os from time import sleep import numpy as np doc = """ a.k.a. Keynesian beauty contest. Players all guess a number; whoever guesses closest to 2/3 of the average wins. See https://en.wikipedia.org/wiki/Guess_2/3_of_the_average """ class C(BaseConstants): NUM_ROUNDS = 1 NAME_IN_URL = 'OnlineExpMemoryOnlyRule' # JACKPOT = Currency(100) # GUESS_MAX = 100 INSTRUCTIONS_TEMPLATE_P = 'CopyTheStyle/instructionsP.html' INSTRUCTIONS_TEMPLATE_R = 'CopyTheStyle/instructionsP.html' INSTRUCTIONS_TEMPLATE_PR = 'CopyTheStyle/instructionsP.html' rule1 = '40;blue;in a random manner;do not touch tiles;same' rule2 = '40;red;in a random manner;do not touch tiles;same' rule3 = '15;blue;;touch the smallest number of tiles;same' rule4 = '15;red;;touch the smallest number of tiles;same' rule = "Place 40 red tiles that do not touch other red tiles; Place 40 blue tiles that do not touch other blue tiles; Place 15 red tiles that touch one and only one red tile;Place 15 blue tiles that touch one and only one blue tile"; N_CHAINS = 10 N_GENS = 1 PLAYERS_PER_GROUP = None grid_size = 12 MAT_INIT = [] with open('OnlineExpMemory/grid_init.txt', encoding='utf-8') as file: for line in file: str_list = line.split() int_list = list(map(int, str_list)) MAT_INIT.append(int_list) class Subsession(BaseSubsession): grid_size = models.IntegerField(initial = C.grid_size); # # class Subsession(BaseSubsession): # print('here?') 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): n_players = len(subsession.get_players()) n_chains = int(C.N_CHAINS) print(n_chains) # C.NUM_ROUNDS = self.session.config['num_demo_participants'] # new_structure = [[] for i in range(n_chains)] # n = 1 # for j in range(C.N_GENS): # for j in range(n_chains): # new_structure[j].append(n) # n+=1 # # print(new_structure) # subsession.set_group_matrix(new_structure) subsession.session.chains = [[['open'] for i in range(n_chains)] for j in range(2)] subsession.session.players_per_treatment = [100,0] class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.IntegerField() waiting = models.BooleanField(initial = True) payment = models.StringField() round_nb = models.IntegerField(initial = 1) has_finished = models.BooleanField(initial = False) has_dropped = models.BooleanField(initial = False) moves = models.StringField(initial = "") final_grid = models.StringField(initial = ' '.join(['0' for i in range (C.grid_size**2)])) score = models.StringField() chain_nb = models.IntegerField() position = models.IntegerField() mutations = models.IntegerField(initial = 0) example1 = models.StringField() example2 = models.StringField() example3 = models.StringField() perim_complex = models.StringField() VisualSimilarity = models.StringField() mean_complex = models.StringField() 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,18,-1)]) gender2 = models.StringField(label="Gender", intial = '--', choices = ['Prefer not to say', 'Other', 'Male', 'Female']); consent = models.StringField() objective_grid = models.StringField() objective_rule1 = models.StringField() objective_rule2 = models.StringField() objective_rule3 = models.StringField() objective_rule4 = models.StringField() technical_pb = models.BooleanField() technical_details = models.StringField() # transmitted_rule = models.StringField() transmitted_rule = models.LongStringField( label="Please type the advice here", ) transmitted_rule1 = models.StringField(); transmitted_rule2 = models.StringField(); transmitted_rule3 = models.StringField(); transmitted_rule4 = 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.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 vars_for_template(player: Player): return dict(has_dropped = player.has_dropped) def before_next_page(player,timeout_happened): 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 dropout(Page): def is_displayed(player : Player): if np.abs(player.age - player.age2) >1: 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 return True if player.gender != player.gender2: 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 return False 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) # def is_displayed(player: Player): # current_round = player.group.round_number # name = '/Users/jeremyperez/Downloads/OBJ' + str(current_round) + '.txt' # if os.path.exists(name): # print('-------REMOVED------') # os.remove(name) # # # # for r in range(current_round,C.NUM_ROUNDS+1): # # name = '/Users/jeremyperez/Downloads/OBJ' + str(r) + '.txt' # # if os.path.exists(name): # # print('-------REMOVED------') # # os.remove(name) # # # # return player.round_number == player.id_in_group 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.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): if player.field_maybe_none("treatment") == None: if player.subsession.session.players_per_treatment[0] <= player.subsession.session.players_per_treatment[1]: player.treatment = 1 player.subsession.session.players_per_treatment[0] += 1 else: player.treatment = 2 player.subsession.session.players_per_treatment[1] += 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 return True # 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 Results(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 = 110 * (4**2 / (1)) Pmin = 2 * (16**2 / (55)) 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': if 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 else: player.consent = data class ConsentForm(Page): pass class AgeGenderForm(Page): form_model = 'player' form_fields = ['age', 'gender'] 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 player.gender = data; class finish(Page): pass # @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.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 print(data) if data[0] == 'check': player.technical_pb = data[1] elif data[0] == 'details': player.technical_details = data[1] page_sequence = [WaitPage1, Information, AgeGenderForm, IntroductionP, observation_phase, task1, transmission_phase2, Results, TechnicalPb, AttentionCheck,dropout, finish, Restart] # IntroductionP, IntroductionR, IntroductionPR, # , Results]