from otree.api import * import random, time doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'CM_trial_no_group' PLAYERS_PER_GROUP = 10 NUM_ROUNDS = 1 # Price levels (check how to put them in list and draw from it) level1 = 4 level2 = 4.5 level3 = 5 level4 = 5.5 level5 = 6 # Probabilities prob_l = 60 prob_m = 75 prob_h = 90 # Quadratic scoring rules quadratic_score_A = 2 quadratic_score_B = 2 prob_replace_l = 60 prob_replace_m = 75 prob_replace_h = 90 prob_not_replace_l = 100 - prob_replace_l prob_not_replace_m = 100 - prob_replace_m prob_not_replace_h = 100 - prob_replace_h # Number of task tasks = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] num_CE = len(tasks) # payoff frequency method payoff_fr = 4 matching_timeout_mins = 5 smaller_group = 6 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): if subsession.round_number == 1: for p in subsession.get_players(): p.participant.num_players = C.PLAYERS_PER_GROUP random_num = random.random() if p.participant.treatment_p == 3 or p.participant.treatment_p == 6: if random_num <= (C.prob_replace_l * 0.01): replace_pred = 1 else: replace_pred = 0 else: if p.participant.treatment_p == 4 or p.participant.treatment_p == 7 or p.participant.treatment_p == 9: if random_num <= (C.prob_replace_m * 0.01): replace_pred = 1 else: replace_pred = 0 else: if random_num <= (C.prob_replace_h * 0.01): replace_pred = 1 else: replace_pred = 0 p.participant.replace_predictions_practice = replace_pred p.rand_A = random.randint(0, C.PLAYERS_PER_GROUP - 1) if p.rand_A < (C.PLAYERS_PER_GROUP - 1): p.rand_B = random.randint(0, ((C.PLAYERS_PER_GROUP - 1) - p.rand_A)) else: p.rand_B = 0 p.rand_C = C.PLAYERS_PER_GROUP - 1 - p.rand_A - p.rand_B # # for w in subsession.get_groups(): # w.binding_sit = random.randint(1, subsession.session.num_participants) class Group(BaseGroup): binding_sit = models.IntegerField(initial=0) sum_binding_sit_1_practice = models.IntegerField(initial=0) sum_binding_sit_2_practice = models.IntegerField(initial=0) sum_binding_sit_3_practice = models.IntegerField(initial=0) id_player_groupA_practice = models.StringField(initial='') id_player_groupB_practice = models.StringField(initial='') id_player_groupC_practice = models.StringField(initial='') list_pred_A_A_practice = models.StringField(initial='') list_pred_A_B_practice = models.StringField(initial='') list_pred_A_C_practice = models.StringField(initial='') list_pred_B_A_practice = models.StringField(initial='') list_pred_B_B_practice = models.StringField(initial='') list_pred_B_C_practice = models.StringField(initial='') list_pred_C_A_practice = models.StringField(initial='') list_pred_C_B_practice = models.StringField(initial='') list_pred_C_C_practice = models.StringField(initial='') list_aux_A_A_practice = models.StringField(initial='') list_aux_A_B_practice = models.StringField(initial='') list_aux_A_C_practice = models.StringField(initial='') list_aux_B_A_practice = models.StringField(initial='') list_aux_B_B_practice = models.StringField(initial='') list_aux_B_C_practice = models.StringField(initial='') list_aux_C_A_practice = models.StringField(initial='') list_aux_C_B_practice = models.StringField(initial='') list_aux_C_C_practice = models.StringField(initial='') class Player(BasePlayer): # Bottle choice CE_choice_practice_aux = models.IntegerField( choices=[[1, "A"], [2, "B"], [3, "Nessun"]], label="Practice Choice situation", widget=widgets.RadioSelect, blank=False, ) def make_field_prediction(label): return models.IntegerField( label=label, min=0, default=0, ) #For T9 this means auxilliary question answers CE_choice_practice_pred_A = models.IntegerField() CE_choice_practice_pred_B = models.IntegerField() CE_choice_practice_pred_C = models.IntegerField() payoff_practice_A = models.CurrencyField() payoff_practice_B = models.CurrencyField() payoff_practice_C = models.CurrencyField() list_choices_A_practice = models.StringField(initial='') list_choices_B_practice = models.StringField(initial='') list_choices_C_practice = models.StringField(initial='') frequency_prediction = models.BooleanField() Test_1a = models.IntegerField( choices=[[0, "60%"], [1, "40%"], [2, "50%"]], widget=widgets.RadioSelectHorizontal, label="Qual’è la probabilità con cui vengono sostituite le tue " "previsioni nella parte 2?", ) Test_1b = models.IntegerField( choices=[[0, "75%"], [1, "25%"], [2, "50%"]], widget=widgets.RadioSelectHorizontal, label="Qual’è la probabilità con cui vengono sostituite le tue " "previsioni nella parte 2?", ) Test_1b_aux = models.IntegerField( choices=[[0, "75%"], [1, "25%"], [2, "50%"]], widget=widgets.RadioSelectHorizontal, label="Qual’è la probabilità con cui vengono sostituite le tue " "scelte nella parte 2?", ) Test_1c = models.IntegerField( choices=[[0, "90%"], [1, "10%"], [2, "50%"]], widget=widgets.RadioSelectHorizontal, label="Qual’è la probabilità con cui vengono sostituite le tue " "previsioni nella parte 2?", ) Test_2 = models.IntegerField( choices=[[0, "Vero"], [1, "Falso"], [2, "Non ricordo"]], widget=widgets.RadioSelectHorizontal, label="Nelle istruzioni appena fornite, vi informiamo che i partecipanti che scelgono la stessa alternativa nella parte 1, " "forniscono delle previsioni molto simili nella parte 2?" ) Test_2_aux = models.IntegerField( choices=[[0, "Vero"], [1, "Falso"], [2, "Non ricordo"]], widget=widgets.RadioSelectHorizontal, label="Nelle istruzioni appena fornite, vi informiamo che i partecipanti che scelgono la stessa alternativa nella parte 1, " "forniscono delle scelte molto simili nella parte 2?" ) Test_3 = models.IntegerField( choices=[[0, "Vero"], [1, "Falso"], [2, "Non saprei"]], widget=widgets.RadioSelectHorizontal, label="Se esprimo le mie scelte sinceramente e facendo molta attenzione nella parte 1, il compenso " "aggiuntivo che posso ottenere nella parte 2 dipende solo dalle mie previsioni?", ) rand_A = models.IntegerField() rand_B = models.IntegerField() rand_C = models.IntegerField() A_choices = models.IntegerField() B_choices = models.IntegerField() C_choices = models.IntegerField() def Test_1a_error_message(player, value): if value > 0: return 'La risposta corretta è: La probabilità con cui le tue previsioni vengono sostituite è 60%' def Test_1b_error_message(player, value): if value > 0: return 'La risposta corretta è: La probabilità con cui le tue previsioni vengono sostituite è 75%' def Test_1c_error_message(player, value): if value > 0: return 'La risposta corretta è: La probabilità con cui le tue previsioni vengono sostituite è 90%' def Test_2_error_message(player, value): if value > 0: return 'La risposta corretta è: Vero vi informiamo che i partecipanti che compiono le stesse scelte nella ' \ 'parte 1, forniscono delle previsioni molto simili nella parte 2' def Test_3_error_message(player, value): if value > 0: return 'La risposta corretta è: Vero se esprimi le tue scelte sinceramente e facendo molta attenzione nella ' \ 'parte 1, il compenso aggiuntivo che posso ottenere nella parte 2 dipende solo dalle mie ' \ 'previsioni' ##################################################################################################################### ######################################## PAGES ###################################################################### ##################################################################################################################### # Trial task 2: predictions (T3-T5) class Trial_3(Page): def is_displayed(player: Player): return player.participant.treatment_p == 3 or player.participant.treatment_p == 4 \ or player.participant.treatment_p == 5 form_model = 'player' form_fields = ['CE_choice_practice_pred_A', 'CE_choice_practice_pred_B', 'CE_choice_practice_pred_C'] @staticmethod def live_method(player: Player, data): if data['clicked_button'] == 1: a = float(data['fieldA']) / (C.PLAYERS_PER_GROUP - 1) b = float(data['fieldB']) / (C.PLAYERS_PER_GROUP - 1) c = float(data['fieldC']) / (C.PLAYERS_PER_GROUP - 1) factor1 = a * a + b * b + c * c payoff_a = round(C.quadratic_score_A + C.quadratic_score_B * (2 * a - factor1), 2) payoff_b = round(C.quadratic_score_A + C.quadratic_score_B * (2 * b - factor1), 2) payoff_c = round(C.quadratic_score_A + C.quadratic_score_B * (2 * c - factor1), 2) response = dict(payoff_a=payoff_a, payoff_b=payoff_b, payoff_c=payoff_c) player.payoff_practice_A = payoff_a player.payoff_practice_B = payoff_b player.payoff_practice_C = payoff_c return {player.id_in_group: response} # Passing data from Python to JavaScript (js_vars) @staticmethod def js_vars(player): return dict(number_players=C.PLAYERS_PER_GROUP, tempA=0, tempB=0, tempC=0) @staticmethod def error_message(player, values): if values['CE_choice_practice_pred_A'] + values['CE_choice_practice_pred_B'] + values[ 'CE_choice_practice_pred_C'] != ( C.PLAYERS_PER_GROUP - 1): return 'La somma delle predizioni deve essere uguale a ' + str(C.PLAYERS_PER_GROUP - 1) @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) return dict(costs1=cost_1, costs2=cost_2, group_size=C.PLAYERS_PER_GROUP - 1) @staticmethod def before_next_page(player: Player, timeout_happened): # Random draw if player.participant.CE_choice_practice == 1: A_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) B_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - A_choices)) C_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - B_choices else: if player.participant.CE_choice_practice == 2: B_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) A_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - B_choices)) C_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - B_choices else: C_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) A_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - C_choices)) B_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - C_choices player.A_choices = A_choices player.B_choices = B_choices player.C_choices = C_choices # Trial task 2: predictions (T3-T5) class Trial_3_fr(Page): def is_displayed(player: Player): return player.participant.treatment_p == 6 or player.participant.treatment_p == 7 \ or player.participant.treatment_p == 8 form_model = 'player' form_fields = ['CE_choice_practice_pred_A', 'CE_choice_practice_pred_B', 'CE_choice_practice_pred_C'] # Passing data from Python to JavaScript (js_vars) @staticmethod def js_vars(player): return dict(number_players=C.PLAYERS_PER_GROUP, tempA=0, tempB=0, tempC=0) @staticmethod def error_message(player, values): if values['CE_choice_practice_pred_A'] + values['CE_choice_practice_pred_B'] + values[ 'CE_choice_practice_pred_C'] != ( C.PLAYERS_PER_GROUP - 1): return 'La somma delle predizioni deve essere uguale a ' + str(C.PLAYERS_PER_GROUP - 1) @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) return dict(costs1=cost_1, costs2=cost_2, group_size=C.PLAYERS_PER_GROUP - 1) @staticmethod def before_next_page(player: Player, timeout_happened): # Random draw if player.participant.CE_choice_practice == 1: A_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) B_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - A_choices)) C_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - B_choices else: if player.participant.CE_choice_practice == 2: B_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) A_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - B_choices)) C_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - B_choices else: C_choices = random.randint(1, C.PLAYERS_PER_GROUP - 1) A_choices = random.randint(0, (C.PLAYERS_PER_GROUP - 1 - C_choices)) B_choices = C.PLAYERS_PER_GROUP - 1 - A_choices - C_choices player.A_choices = A_choices player.B_choices = B_choices player.C_choices = C_choices # Trial task 2: auxilliary choice (T9) class Trial_3_aux(Page): def is_displayed(player: Player): return player.participant.treatment_p == 9 form_model = 'player' form_fields = ['CE_choice_practice_aux'] # # def before_next_page(player: Player, timeout_happened): @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.random_choice_practice = random.randint(1, 3) # Random draw A_choices = random.randint(0,1) if A_choices == 1: B_choices = 0 C_choices = 0 else: B_choices = random.randint(0,1) if B_choices == 1: C_choices = 0 else: C_choices = 1 player.A_choices = A_choices player.B_choices = B_choices player.C_choices = C_choices class Wait_practice_test_aux(WaitPage): def is_displayed(player: Player): return player.participant.treatment_p == 9 title_text = "Ti chiediamo gentilmente di attendere" body_text = "Attendi che tutti i partecipanti abbiano completato la parte 1" def after_all_players_arrive(group: Group): for p in group.in_round(1).get_players(): # Number of p choosing option X group.sum_binding_sit_1_practice = p.participant.CE_choice_practice * ( p.participant.CE_choice_practice == 1) + group.sum_binding_sit_1_practice group.sum_binding_sit_2_practice = int( p.participant.CE_choice_practice * (p.participant.CE_choice_practice == 2) / 2) + group.sum_binding_sit_2_practice group.sum_binding_sit_3_practice = int( p.participant.CE_choice_practice * (p.participant.CE_choice_practice == 3) / 3) + group.sum_binding_sit_3_practice # List of p ID's who chose option X group.id_player_groupA_practice = str(p.id_in_group) * ( p.participant.CE_choice_practice == 1) + ',' + group.id_player_groupA_practice group.id_player_groupB_practice = str(p.id_in_group) * ( p.participant.CE_choice_practice == 2) + ',' + group.id_player_groupB_practice group.id_player_groupC_practice = str(p.id_in_group) * ( p.participant.CE_choice_practice == 3) + ',' + group.id_player_groupC_practice if p.CE_choice_practice_aux == 1: p.CE_choice_practice_pred_A = 1 p.CE_choice_practice_pred_B = 0 p.CE_choice_practice_pred_C = 0 else: if p.CE_choice_practice_aux == 2: p.CE_choice_practice_pred_A = 0 p.CE_choice_practice_pred_B = 1 p.CE_choice_practice_pred_C = 0 else: p.CE_choice_practice_pred_A = 0 p.CE_choice_practice_pred_B = 0 p.CE_choice_practice_pred_C = 1 # # List of predictions for option X by those who chose A group.list_pred_A_A_practice = str(p.CE_choice_practice_pred_A) * ( p.participant.CE_choice_practice == 1) + ',' + group.list_pred_A_A_practice group.list_pred_A_B_practice = str(p.CE_choice_practice_pred_B) * ( p.participant.CE_choice_practice == 1) + ',' + group.list_pred_A_B_practice group.list_pred_A_C_practice = str(p.CE_choice_practice_pred_C) * ( p.participant.CE_choice_practice == 1) + ',' + group.list_pred_A_C_practice # # # List of predictions for option X by those who chose B group.list_pred_B_A_practice = str(p.CE_choice_practice_pred_A) * ( p.participant.CE_choice_practice == 2) + ',' + group.list_pred_B_A_practice group.list_pred_B_B_practice = str(p.CE_choice_practice_pred_B) * ( p.participant.CE_choice_practice == 2) + ',' + group.list_pred_B_B_practice group.list_pred_B_C_practice = str(p.CE_choice_practice_pred_C) * ( p.participant.CE_choice_practice == 2) + ',' + group.list_pred_B_C_practice # # List of predictions for option X by those who chose C group.list_pred_C_A_practice = str(p.CE_choice_practice_pred_A) * ( p.participant.CE_choice_practice == 3) + ',' + group.list_pred_C_A_practice group.list_pred_C_B_practice = str(p.CE_choice_practice_pred_B) * ( p.participant.CE_choice_practice == 3) + ',' + group.list_pred_C_B_practice group.list_pred_C_C_practice = str(p.CE_choice_practice_pred_C) * ( p.participant.CE_choice_practice == 3) + ',' + group.list_pred_C_C_practice # for p in group.in_round(1).get_players(): if p.participant.CE_choice_practice == 1: # participants who chose option A p.list_choices_A_practice = " ".join(['A'] * (group.sum_binding_sit_1_practice - 1)) p.list_choices_B_practice = " ".join(['B'] * group.sum_binding_sit_2_practice) p.list_choices_C_practice = " ".join(['C'] * group.sum_binding_sit_3_practice) list_pred_A_A_practice_temp = group.list_pred_A_A_practice list_pred_A_B_practice_temp = group.list_pred_A_B_practice list_pred_A_C_practice_temp = group.list_pred_A_C_practice list_pred_A_A_practice_temp2 = list_pred_A_A_practice_temp.split(",") list_pred_A_B_practice_temp2 = list_pred_A_B_practice_temp.split(",") list_pred_A_C_practice_temp2 = list_pred_A_C_practice_temp.split(",") list_pred_A_A_practice_temp3 = [i for i in list_pred_A_A_practice_temp2 if i] list_pred_A_B_practice_temp3 = [i for i in list_pred_A_B_practice_temp2 if i] list_pred_A_C_practice_temp3 = [i for i in list_pred_A_C_practice_temp2 if i] temp_id_resto_temp_ = group.id_player_groupA_practice.split(",") temp_id_resto_temp_2 = [i for i in temp_id_resto_temp_ if i] index_remove = temp_id_resto_temp_2.index(str(p.id_in_group)) del list_pred_A_A_practice_temp3[index_remove] del list_pred_A_B_practice_temp3[index_remove] del list_pred_A_C_practice_temp3[index_remove] p.participant.group_list_pred_A_practice = list_pred_A_A_practice_temp3 p.participant.group_list_pred_B_practice = list_pred_A_B_practice_temp3 p.participant.group_list_pred_C_practice = list_pred_A_C_practice_temp3 temp_id_resto = group.id_player_groupA_practice.replace(str(p.id_in_group), "") temp_id_resto2 = temp_id_resto.split(",") p.participant.id_resto = [i for i in temp_id_resto2 if i] else: if p.participant.CE_choice_practice == 2: # participants who chose option B p.list_choices_A_practice = " ".join(['A'] * group.sum_binding_sit_1_practice) p.list_choices_B_practice = " ".join(['B'] * (group.sum_binding_sit_2_practice - 1)) p.list_choices_C_practice = " ".join(['C'] * group.sum_binding_sit_3_practice) list_pred_B_A_practice_temp = group.list_pred_B_A_practice list_pred_B_B_practice_temp = group.list_pred_B_B_practice list_pred_B_C_practice_temp = group.list_pred_B_C_practice list_pred_B_A_practice_temp2 = list_pred_B_A_practice_temp.split(",") list_pred_B_B_practice_temp2 = list_pred_B_B_practice_temp.split(",") list_pred_B_C_practice_temp2 = list_pred_B_C_practice_temp.split(",") list_pred_B_A_practice_temp3 = [i for i in list_pred_B_A_practice_temp2 if i] list_pred_B_B_practice_temp3 = [i for i in list_pred_B_B_practice_temp2 if i] list_pred_B_C_practice_temp3 = [i for i in list_pred_B_C_practice_temp2 if i] temp_id_resto_temp_ = group.id_player_groupB_practice.split(",") temp_id_resto_temp_2 = [i for i in temp_id_resto_temp_ if i] index_remove = temp_id_resto_temp_2.index(str(p.id_in_group)) del list_pred_B_A_practice_temp3[index_remove] del list_pred_B_B_practice_temp3[index_remove] del list_pred_B_C_practice_temp3[index_remove] p.participant.group_list_pred_A_practice = list_pred_B_A_practice_temp3 p.participant.group_list_pred_B_practice = list_pred_B_B_practice_temp3 p.participant.group_list_pred_C_practice = list_pred_B_C_practice_temp3 temp_id_resto = group.id_player_groupB_practice.replace(str(p.id_in_group), "") temp_id_resto2 = temp_id_resto.split(",") p.participant.id_resto = [i for i in temp_id_resto2 if i] else: # participants who chose option C p.list_choices_A_practice = " ".join(['A'] * group.sum_binding_sit_1_practice) p.list_choices_B_practice = " ".join(['B'] * group.sum_binding_sit_2_practice) p.list_choices_C_practice = " ".join(['C'] * (group.sum_binding_sit_3_practice - 1)) list_pred_C_A_practice_temp = group.list_pred_C_A_practice list_pred_C_B_practice_temp = group.list_pred_C_B_practice list_pred_C_C_practice_temp = group.list_pred_C_C_practice list_pred_C_A_practice_temp2 = list_pred_C_A_practice_temp.split(",") list_pred_C_B_practice_temp2 = list_pred_C_B_practice_temp.split(",") list_pred_C_C_practice_temp2 = list_pred_C_C_practice_temp.split(",") list_pred_C_A_practice_temp3 = [i for i in list_pred_C_A_practice_temp2 if i] list_pred_C_B_practice_temp3 = [i for i in list_pred_C_B_practice_temp2 if i] list_pred_C_C_practice_temp3 = [i for i in list_pred_C_C_practice_temp2 if i] temp_id_resto_temp_ = group.id_player_groupC_practice.split(",") temp_id_resto_temp_2 = [i for i in temp_id_resto_temp_ if i] index_remove = temp_id_resto_temp_2.index(str(p.id_in_group)) del list_pred_C_A_practice_temp3[index_remove] del list_pred_C_B_practice_temp3[index_remove] del list_pred_C_C_practice_temp3[index_remove] p.participant.group_list_pred_A_practice = list_pred_C_A_practice_temp3 p.participant.group_list_pred_B_practice = list_pred_C_B_practice_temp3 p.participant.group_list_pred_C_practice = list_pred_C_C_practice_temp3 temp_id_resto = group.id_player_groupC_practice.replace(str(p.id_in_group), "") temp_id_resto2 = temp_id_resto.split(",") p.participant.id_resto = [i for i in temp_id_resto2 if i] class fortune_wheel(Page): def is_displayed(player: Player): return player.participant.treatment_p == 3 or player.participant.treatment_p == 4 \ or player.participant.treatment_p == 5 or player.participant.treatment_p == 6 \ or player.participant.treatment_p == 7 or player.participant.treatment_p == 8 \ or player.participant.treatment_p == 9 @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions_practice, treatment=player.participant.treatment_p) class Trial_results_no_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 3 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 4 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 5 @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions_practice) @staticmethod def vars_for_template(player): cost_1 = str(C.level1) cost_2 = str(C.level2) return dict(costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1, payoff_a=player.payoff_practice_A, payoff_b=player.payoff_practice_B, payoff_c=player.payoff_practice_C) class Trial_results_no_replace_fr(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 6 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 7 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 8 @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions_practice) @staticmethod def vars_for_template(player): cost_1 = str(C.level1) cost_2 = str(C.level2) nr_pred_A = player.A_choices nr_pred_B = player.B_choices nr_pred_C = player.C_choices nr_other_choice_A = player.A_choices nr_other_choice_B = player.B_choices nr_other_choice_C = player.C_choices if player.CE_choice_practice_pred_A == nr_other_choice_A and player.CE_choice_practice_pred_B == nr_other_choice_B and player.CE_choice_practice_pred_C == nr_other_choice_C: player.frequency_prediction = 1 else: player.frequency_prediction = 0 return dict(costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1, frequency_prediction=player.frequency_prediction, nr_pred_A=nr_pred_A, nr_pred_B=nr_pred_B, nr_pred_C=nr_pred_C) class Trial_results_no_replace_aux(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 9 @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions_practice) @staticmethod def vars_for_template(player): cost_1 = str(C.level1) cost_2 = str(C.level2) return dict(costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1) class Trial_results_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 3 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 4 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 5 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 6 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 7 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 8 \ @staticmethod def js_vars(player): return dict(replace=player.participant.replace_predictions_practice) @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) replaced_A = player.rand_A replaced_B = player.rand_B replaced_C = player.rand_C Pred_A = replaced_A / (C.PLAYERS_PER_GROUP - 1) Pred_B = replaced_B / (C.PLAYERS_PER_GROUP - 1) Pred_C = replaced_C / (C.PLAYERS_PER_GROUP - 1) factor1 = Pred_A * Pred_A + Pred_B * Pred_B + Pred_C * Pred_C payoff_a = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_A - factor1), 2) payoff_b = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_B - factor1), 2) payoff_c = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_C - factor1), 2) if player.participant.treatment_p == 6 or player.participant.treatment_p == 7 \ or player.participant.treatment_p == 8: nr_other_choice_A = player.A_choices nr_other_choice_B = player.B_choices nr_other_choice_C = player.C_choices if replaced_A == nr_other_choice_A and replaced_B == nr_other_choice_B and replaced_C == nr_other_choice_C: player.frequency_prediction = 1 else: player.frequency_prediction = 0 else: player.frequency_prediction = 0 nr_pred_A = player.A_choices nr_pred_B = player.B_choices nr_pred_C = player.C_choices # cont = list(range(0, leng)) return dict(replaced_A=replaced_A, replaced_B=replaced_B, replaced_C=replaced_C, costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1, payoff_a=payoff_a, payoff_b=payoff_b, payoff_c=payoff_c, frequency_prediction=player.frequency_prediction, nr_pred_A=nr_pred_A, nr_pred_B=nr_pred_B, nr_pred_C=nr_pred_C) class Trial_binding_alt_payoff(Page): def is_displayed(player: Player): return player.participant.treatment_p == 3 or player.participant.treatment_p == 4 \ or player.participant.treatment_p == 5 @staticmethod def js_vars(player): return dict(random_choice=player.participant.random_choice_practice) @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) number_A = [1] * player.A_choices number_B = [2] * player.B_choices number_C = [3] * player.C_choices list_choices = number_A + number_B + number_C player.participant.random_choice_practice = random.choice(list_choices) print('random choice is', player.participant.random_choice_practice, 'from the list', list_choices) return dict(costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1, listA=number_A, listB=number_B, listC=number_C, random_prediction_A=player.A_choices, random_prediction_B=player.B_choices, random_prediction_C=player.C_choices) class Trial_payoff_no_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 3 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 4 \ or player.participant.replace_predictions_practice == 0 and player.participant.treatment_p == 5 @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) return dict(costs1=cost_1, costs2=cost_2, num_participants=C.PLAYERS_PER_GROUP - 1, random_choice_practice=player.participant.random_choice_practice) class Trial_payoff_replace(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 3 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 4 \ or player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 5 @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) replaced_A = player.rand_A replaced_B = player.rand_B replaced_C = player.rand_C Pred_A = replaced_A / (C.PLAYERS_PER_GROUP - 1) Pred_B = replaced_B / (C.PLAYERS_PER_GROUP - 1) Pred_C = replaced_C / (C.PLAYERS_PER_GROUP - 1) factor1 = Pred_A * Pred_A + Pred_B * Pred_B + Pred_C * Pred_C payoff_a = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_A - factor1), 2) payoff_b = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_B - factor1), 2) payoff_c = round(C.quadratic_score_A + C.quadratic_score_B * (2 * Pred_C - factor1), 2) return dict(costs1=cost_1, costs2=cost_2, selectedA=replaced_A, selectedB=replaced_B, selectedC=replaced_C, num_participants=C.PLAYERS_PER_GROUP - 1, payoff_a=payoff_a, payoff_b=payoff_b, payoff_c=payoff_c, random_choice_practice=player.participant.random_choice_practice) class Trial_payoff_replace_aux(Page): def is_displayed(player: Player): return player.participant.replace_predictions_practice == 1 and player.participant.treatment_p == 9 @staticmethod def vars_for_template(player): cost_2 = str(C.level2) cost_1 = str(C.level1) return dict(costs1=cost_1, costs2=cost_2, random_choice_practice=player.participant.random_choice_practice ) class Comprehension_questions(Page): def is_displayed(player: Player): return player.participant.treatment_p == 3 or player.participant.treatment_p == 4 \ or player.participant.treatment_p == 5 or player.participant.treatment_p == 6 \ or player.participant.treatment_p == 7 or player.participant.treatment_p == 8 \ or player.participant.treatment_p == 9 form_model = 'player' @staticmethod def get_form_fields(player): if player.participant.treatment_p == 3 or player.participant.treatment_p == 6: return ['Test_1a', 'Test_2', 'Test_3'] else: if player.participant.treatment_p == 4 or player.participant.treatment_p == 7: return ['Test_1b', 'Test_2', 'Test_3'] else: if player.participant.treatment_p == 9: return ['Test_1b_aux', 'Test_2_aux', 'Test_3'] else: return ['Test_1c', 'Test_2', 'Test_3'] class Final_waiting_page(Page): def is_displayed(player: Player): return player.participant.treatment_p > 2 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant participant.wait_page_arrival = time.time() print(participant.wait_page_arrival) @staticmethod def app_after_this_page(player: Player, upcoming_apps): # print('upcoming app is', upcoming_apps) if player.participant.treatment_p > 2: return "CM_DCE_2" page_sequence = [ Trial_3, Trial_3_fr, Trial_3_aux, # Wait_practice_test_aux, fortune_wheel, Trial_results_no_replace, Trial_results_no_replace_fr, Trial_results_no_replace_aux, Trial_results_replace, Trial_binding_alt_payoff, Trial_payoff_no_replace, Trial_payoff_replace, Trial_payoff_replace_aux, Comprehension_questions, Final_waiting_page ]