import random from .test_components import test from otree.api import * import itertools doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'additions_rounds_agents' PLAYERS_PER_GROUP = None PARAMETERIZATIONS = list(range(1, 11)) NUM_ROUNDS = len(PARAMETERIZATIONS) # NUM_ROUNDS = 1 HIGHPAYOFF = cu(2) LOWPAYOFF = cu(0) BELIEFPAYOFF = cu(2.5) TOTAL = 0 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): if subsession.round_number == 1: treatments = itertools.cycle(['Afirst', 'Pfirst']) for p in subsession.get_players(): p.participant.afirst = False p.participant.pfirst = False a = list(range(1, int(C.NUM_ROUNDS + 1))) random.shuffle(a) param_rounds = a print('param_rounds is', param_rounds) p.participant.param_rounds = param_rounds p.participant.treatment = next(treatments) if p.participant.treatment == 'Afirst': p.participant.afirst = True if p.participant.treatment == 'Pfirst': p.participant.pfirst = True print('Additions first:', p.participant.afirst, 'Puzzles first:', p.participant.pfirst) # each round is: [add1_num1, add1_num2, add1_num3, add1_correct, add2_num1, add2_num2, add2_num3, add2_correct, # add3_num1, add3_num2, add3_num3, add3_correct, add4_num1, add4_num2, add4_num3, add4_correct, add5_num1, # add5_num2, add5_num3, add5_correct, add6_num1, add6_num2, add6_num3, add6_correct, add7_num1, add7_num2, # add7_num3, add7_correct, prob_c0, prob_c1, prob_c2, prob_c3, prob_c4, prob_c5, prob_c6, prob_c7] + [puzzle1, # puzzle2, puzzle3, correct_answer_1, correct_answer_2, correct_answer_3, prob_c0, prob_c1, prob_c2, prob_c3] r1 = [51, 97, 15, 163, 46, 20, 79, 145, 43, 66, 82, 191, 24, 66, 98, 188, 30, 42, 77, 149, 60, 34, 50, 144, 76, 42, 16, 134, 3, 50, 70, 75, 80, 90, 95, 97] + ["/static/puzzles_rounds_agents/Slide07.png", "/static/puzzles_rounds_agents/Slide08.png", "/static/puzzles_rounds_agents/Slide17.png", 6, 1, 5, 3, 60, 80, 90] r2 = [44, 33, 44, 121, 57, 56, 17, 130, 99, 72, 88, 259, 76, 41, 82, 199, 21, 38, 77, 136, 53, 90, 71, 214, 88, 73, 11, 172, 2, 10, 15, 25, 30, 35, 40, 50] + ["/static/puzzles_rounds_agents/Slide03.png", "/static/puzzles_rounds_agents/Slide10.png", "/static/puzzles_rounds_agents/Slide31.png", 4, 7, 6, 5, 30, 45, 55] r3 = [94, 13, 60, 167, 86, 87, 37, 210, 93, 44, 95, 232, 62, 87, 23, 172, 17, 56, 11, 84, 97, 37, 34, 168, 65, 32, 19, 116, 5, 20, 30, 40, 45, 50, 55, 75] + ["/static/puzzles_rounds_agents/Slide11.png", "/static/puzzles_rounds_agents/Slide16.png", "/static/puzzles_rounds_agents/Slide25.png", 7, 5, 6, 3, 60, 80, 90] r4 = [35, 97, 80, 212, 29, 79, 54, 162, 18, 71, 80, 169, 26, 30, 93, 149, 11, 71, 73, 155, 49, 51, 27, 127, 41, 55, 15, 111, 3, 50, 70, 75, 80, 90, 95, 97] + ["/static/puzzles_rounds_agents/Slide04.png", "/static/puzzles_rounds_agents/Slide13.png", "/static/puzzles_rounds_agents/Slide28.png", 1, 3, 6, 5, 30, 45, 55] r5 = [45, 58, 89, 192, 52, 18, 39, 109, 57, 23, 45, 125, 73, 44, 76, 193, 14, 21, 29, 64, 95, 46, 43, 184, 78, 57, 26, 161, 2, 10, 15, 25, 30, 35, 40, 50] + ["/static/puzzles_rounds_agents/Slide14.png", "/static/puzzles_rounds_agents/Slide19.png", "/static/puzzles_rounds_agents/Slide20.png", 2, 3, 6, 3, 60, 80, 90] r6 = [76, 69, 66, 211, 84, 57, 61, 202, 21, 67, 86, 174, 96, 63, 69, 228, 84, 88, 57, 229, 99, 88, 61, 248, 41, 56, 63, 160, 5, 20, 30, 40, 45, 50, 55, 75] + ["/static/puzzles_rounds_agents/Slide09.png", "/static/puzzles_rounds_agents/Slide23.png", "/static/puzzles_rounds_agents/Slide26.png", 4, 2, 3, 5, 30, 45, 55] r7 = [63, 68, 31, 162, 16, 70, 14, 100, 27, 79, 19, 125, 75, 20, 71, 166, 29, 87, 31, 147, 73, 90, 89, 252, 15, 34, 37, 86, 3, 50, 70, 75, 80, 90, 95, 97] + ["/static/puzzles_rounds_agents/Slide12.png", "/static/puzzles_rounds_agents/Slide15.png", "/static/puzzles_rounds_agents/Slide24.png", 7, 5, 2, 3, 60, 80, 90] r8 = [94, 83, 47, 224, 86, 95, 73, 254, 60, 62, 51, 173, 97, 37, 43, 177, 96, 57, 96, 249, 60, 45, 60, 165, 84, 99, 73, 256, 2, 10, 15, 25, 30, 35, 40, 50] + ["/static/puzzles_rounds_agents/Slide06.png", "/static/puzzles_rounds_agents/Slide17.png", "/static/puzzles_rounds_agents/Slide29.png", 4, 5, 7, 5, 30, 45, 55] r9 = [88, 27, 40, 155, 69, 55, 28, 152, 28, 44, 26, 98, 23, 29, 40, 92, 32, 82, 51, 165, 67, 30, 68, 165, 80, 40, 65, 185, 5, 20, 30, 40, 45, 50, 55, 75] + ["/static/puzzles_rounds_agents/Slide05.png", "/static/puzzles_rounds_agents/Slide27.png", "/static/puzzles_rounds_agents/Slide30.png", 1, 8, 7, 3, 60, 80, 90] r10 = [23, 65, 13, 101, 66, 61, 80, 207, 46, 41, 32, 119, 39, 82, 51, 172, 13, 17, 82, 112, 24, 50, 71, 145, 55, 16, 39, 110, 3, 50, 70, 75, 80, 90, 95, 97] + ["/static/puzzles_rounds_agents/Slide02.png", "/static/puzzles_rounds_agents/Slide21.png", "/static/puzzles_rounds_agents/Slide22.png", 1, 8, 5, 5, 30, 45, 55] subsession.session.parameterization = (r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) class Group(BaseGroup): pass class Player(BasePlayer): q1_addition = models.IntegerField( label='', ) q2_addition = models.IntegerField( label='', ) q3_addition = models.IntegerField( label='', ) q4_addition = models.IntegerField( label='', ) q5_addition = models.IntegerField( label='', ) q6_addition = models.IntegerField( label='', ) q7_addition = models.IntegerField( label='', ) selfbelief1 = models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7], label='How many additions do you think you solved correctly?', ) selfbelief2 = models.IntegerField( choices=[ [1, '$0'], [2, '$2'], ], label='How much do you think the Decider will earn because of your effort?', widget=widgets.RadioSelectHorizontal, ) selfbelief3 = models.FloatField(min=0, max=1.75, label='How much out of $1.75 do you think the Decider will give to you?', ) Addition_Q1_correct = models.IntegerField() Addition_Q2_correct = models.IntegerField() Addition_Q3_correct = models.IntegerField() Addition_Q4_correct = models.IntegerField() Addition_Q5_correct = models.IntegerField() Addition_Q6_correct = models.IntegerField() Addition_Q7_correct = models.IntegerField() total_correct = models.IntegerField(initial=0) total = models.IntegerField() problottery = models.IntegerField() profitP = models.CurrencyField() correctQ = models.CurrencyField() profitB = models.CurrencyField() final_payoff = models.CurrencyField() randomnumber_lottery = models.IntegerField() def rnumber_lottery(player): player.randomnumber_lottery = random.randint(0,100) def set_payoff1(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][3] == player.q1_addition: player.Addition_Q1_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][3] == player.q1_addition: player.Addition_Q1_correct = 0 def set_payoff2(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][7] == player.q2_addition: player.Addition_Q2_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][7] == player.q2_addition: player.Addition_Q2_correct = 0 def set_payoff3(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][11] == player.q3_addition: player.Addition_Q3_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][11] == player.q3_addition: player.Addition_Q3_correct = 0 def set_payoff4(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][15] == player.q4_addition: player.Addition_Q4_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][15] == player.q4_addition: player.Addition_Q4_correct = 0 def set_payoff5(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][19] == player.q5_addition: player.Addition_Q5_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][19] == player.q5_addition: player.Addition_Q5_correct = 0 def set_payoff6(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][23] == player.q6_addition: player.Addition_Q6_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][23] == player.q6_addition: player.Addition_Q6_correct = 0 def set_payoff7(player): if player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][27] == player.q7_addition: player.Addition_Q7_correct = 1 if not player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][27] == player.q7_addition: player.Addition_Q7_correct = 0 def set_payoff_total(player): player.total = (player.Addition_Q7_correct + player.Addition_Q6_correct + player.Addition_Q5_correct + player.Addition_Q4_correct + player.Addition_Q3_correct + player.Addition_Q2_correct + player.Addition_Q1_correct) # This is testing to get other info from another file, potentially we could run info from an excel # sheet and input the data into principals # player.total = test_components.test def set_lottery(player): if player.total == 7: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][35] if player.total == 6: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][34] if player.total == 5: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][33] if player.total == 4: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][32] if player.total == 3: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][31] if player.total == 2: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][30] if player.total == 1: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][29] if player.total == 0: player.problottery = player.session.parameterization[player.participant.param_rounds[player.round_number - 1] - 1][28] #this is to test the other variable # if player.total == 999: # player.problottery = C.PROBABILITY_C0COM def set_profitp1(player): if player.problottery >= player.randomnumber_lottery: player.profitP = C.HIGHPAYOFF if not player.problottery >= player.randomnumber_lottery: player.profitP = C.LOWPAYOFF # PAGES class Start_round(Page): pass class calibration(Page): @staticmethod def vars_for_template(player): pp = player.participant ps = player.session current_parameterization = pp.param_rounds[player.round_number - 1] probability = ps.parameterization[current_parameterization - 1][28:36] return dict( current_parameterization=current_parameterization, prob_c0=probability[0], prob_c1=probability[1], prob_c2=probability[2], prob_c3=probability[3], prob_c4=probability[4], prob_c5=probability[5], prob_c6=probability[6], prob_c7=probability[7], ) class Performer_additions(Page): form_model='player' form_fields=['q1_addition', 'q2_addition', 'q3_addition', 'q4_addition', 'q5_addition', 'q6_addition', 'q7_addition'] timeout_seconds = 3 #this time was originally set to 2 seconds, changed to 45 seconds @staticmethod def vars_for_template(player): pp = player.participant ps = player.session current_parameterization = pp.param_rounds[player.round_number - 1] add1 = ps.parameterization[current_parameterization - 1][0:3] add2 = ps.parameterization[current_parameterization - 1][4:7] add3 = ps.parameterization[current_parameterization - 1][8:11] add4 = ps.parameterization[current_parameterization - 1][12:15] add5 = ps.parameterization[current_parameterization - 1][16:19] add6 = ps.parameterization[current_parameterization - 1][20:23] add7 = ps.parameterization[current_parameterization - 1][24:27] return dict( current_parameterization=current_parameterization, add1_num1=add1[0], add1_num2=add1[1], add1_num3=add1[2], add2_num1=add2[0], add2_num2=add2[1], add2_num3=add2[2], add3_num1=add3[0], add3_num2=add3[1], add3_num3=add3[2], add4_num1=add4[0], add4_num2=add4[1], add4_num3=add4[2], add5_num1=add5[0], add5_num2=add5[1], add5_num3=add5[2], add6_num1=add6[0], add6_num2=add6[1], add6_num3=add6[2], add7_num1=add7[0], add7_num2=add7[1], add7_num3=add7[2], ) @staticmethod def before_next_page(player: Player, timeout_happened): player.rnumber_lottery() player.set_payoff1() player.set_payoff2() player.set_payoff3() player.set_payoff4() player.set_payoff5() player.set_payoff6() player.set_payoff7() player.set_payoff_total() player.set_lottery() player.set_profitp1() class Performer_beliefs(Page): form_model='player' form_fields=['selfbelief1', 'selfbelief2', 'selfbelief3'] page_sequence = [Start_round, calibration, Performer_additions, Performer_beliefs] # page_sequence = [Start_round, calibration]