import itertools from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'testapp' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 endowment = cu(10) #multiplication_factor = 3 class Subsession(BaseSubsession): pass class Group(BaseGroup): multiplication_factor = models.IntegerField() sent_amount = models.CurrencyField( label="How much do you want to send to participant B?", min=cu(0), max=C.endowment ) sent_back_amount = models.CurrencyField( label="How much do you want to send back?", ) class Player(BasePlayer): pass # Functions def creating_session(subsession: Subsession): treatment = itertools.cycle([3,4]) for group in subsession.get_groups(): group.multiplication_factor = next(treatment) def sent_back_amount_choices(group: Group): # auto run as connected to variable return currency_range( cu(0), group.sent_amount * group.multiplication_factor, cu(0.5) ) def set_payoffs(group: Group): # need to tell otree when to trigger p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = C.endowment - group.sent_amount + group.sent_back_amount p2.payoff = group.sent_amount * group.multiplication_factor - group.sent_back_amount # PAGES class Send(Page): form_model = 'group' form_fields = ['sent_amount'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class WaitForP1(WaitPage): pass class SendBack(Page): form_model = 'group' form_fields = ['sent_back_amount'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 @staticmethod def vars_for_template(player: Player): group = player.group return dict( tripled_amount=group.sent_amount * group.multiplication_factor ) class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): pass page_sequence = [Send, WaitForP1, SendBack, ResultsWaitPage, Results] def set_payoffs(subsession: Subsession): print('set payoffs initiated') for g in subsession.get_groups(): # get players by position p1 = g.get_player_by_id(1) p2 = g.get_player_by_id(2) p3 = g.get_player_by_id(3) # player 1 p1.nbs_allocation = C.g12*p2.own_allocation + C.g13*p3.own_allocation print('p1 nbs allocation', p1.nbs_allocation) p1.private_account = subsession.session.endowment - p1.own_allocation print('p1 private account', p1.private_account) if subsession.session.provision == 1: p1.group_account = p1.own_allocation + subsession.session.par_delta*p1.nbs_allocation print('p1 group account', p1.group_account) p1.payoff = subsession.session.par_r * (subsession.session.par_v * (p1.private_account) + subsession.session.par_a * (p1.group_account) - subsession.session.par_b * (p1.group_account) ** 3 + subsession.session.par_h * (p1.nbs_allocation)) print('p1 payoff', p1.payoff) else: p1.group_account = p1.own_allocation + 2*subsession.session.par_delta*p1.nbs_allocation print('p1 group account', p1.group_account) if p1.group_account == 0: p1.payoff = subsession.session.par_r * (subsession.session.par_v * p1.private_account) print('p1 payoff', p1.payoff) else: p1.payoff = subsession.session.par_r * (subsession.session.par_v * (p1.private_account) + (p1.own_allocation / p1.group_account) * (subsession.session.par_a * (p1.group_account) - subsession.session.par_b * (p1.group_account) ** 2) + subsession.session.par_h * (p1.nbs_allocation)) print('p1 payoff', p1.payoff) # player 2 p2.nbs_allocation = C.g21 * p1.own_allocation + C.g23 * p3.own_allocation print('p2 nbs allocation', p2.nbs_allocation) p2.private_account = subsession.session.endowment - p2.own_allocation print('p2 private account', p2.private_account) if subsession.session.provision == 1: p2.group_account = p2.own_allocation + subsession.session.par_delta * p2.nbs_allocation print('p2 group account', p2.group_account) p2.payoff = subsession.session.par_r * (subsession.session.par_v * (p2.private_account) + subsession.session.par_a * (p2.group_account) - subsession.session.par_b * (p2.group_account) ** 3 + subsession.session.par_h * (p2.nbs_allocation)) print('p2 payoff', p2.payoff) else: p2.group_account = p2.own_allocation + 2*subsession.session.par_delta*p2.nbs_allocation print('p2 group account', p2.group_account) if p2.group_account == 0: p2.payoff = subsession.session.par_r * (subsession.session.par_v * p2.private_account) print('p2 payoff', p2.payoff) else: p2.payoff = subsession.session.par_r * (subsession.session.par_v * (p2.private_account) + (p2.own_allocation / p2.group_account) * (subsession.session.par_a * (p2.group_account) - subsession.session.par_b * (p2.group_account) ** 2) + subsession.session.par_h * (p2.nbs_allocation)) print('p2 payoff', p2.payoff) # player 3 p3.nbs_allocation = C.g31 * p1.own_allocation + C.g32 * p2.own_allocation print('p3 nbs allocation', p3.nbs_allocation) p3.private_account = subsession.session.endowment - p3.own_allocation print('p3 private account', p3.private_account) if subsession.session.provision == 1: p3.group_account = p3.own_allocation + subsession.session.par_delta * p3.nbs_allocation print('p3 group account', p3.group_account) p3.payoff = subsession.session.par_r * (subsession.session.par_v * (p3.private_account) + subsession.session.par_a * (p3.group_account) - subsession.session.par_b * (p3.group_account) ** 3 + subsession.session.par_h * (p3.nbs_allocation)) print('p3 payoff', p3.payoff) else: p3.group_account = p3.own_allocation + 2*subsession.session.par_delta*p3.nbs_allocation print('p3 group account', p3.group_account) if p3.group_account == 0: p3.payoff = subsession.session.par_r * (subsession.session.par_v * p3.private_account) print('p3 payoff', p3.payoff) else: p3.payoff = subsession.session.par_r * (subsession.session.par_v * (p3.private_account) + (p3.own_allocation / p3.group_account) * (subsession.session.par_a * (p3.group_account) - subsession.session.par_b * (p3.group_account) ** 2) + subsession.session.par_h * (p3.nbs_allocation)) print('p3 payoff', p3.payoff) def set_payoffs(subsession: Subsession): print('set payoffs initiated') for g in subsession.get_groups(): # get players by position p1 = g.get_player_by_id(1) p2 = g.get_player_by_id(2) p3 = g.get_player_by_id(3) p4 = g.get_player_by_id(4) p5 = g.get_player_by_id(5) p6 = g.get_player_by_id(6) # player 1 p1.nbs_allocation = C.g12*p2.own_allocation + C.g13*p3.own_allocation + C.g14*p4.own_allocation + C.g15*p5.own_allocation + C.g16*p6.own_allocation print('p1 nbs allocation', p1.nbs_allocation) p1.private_account = subsession.session.endowment - p1.own_allocation print('p1 private account', p1.private_account) if subsession.session.provision == 1: p1.group_account = p1.own_allocation + subsession.session.par_delta*p1.nbs_allocation print('p1 group account', p1.group_account) p1.payoff = subsession.session.par_r * (subsession.session.par_v * (p1.private_account) + subsession.session.par_a * (p1.group_account) - subsession.session.par_b * (p1.group_account) ** 3 + subsession.session.par_h * (p1.nbs_allocation)) print('p1 payoff', p1.payoff) else: p1.group_account = p1.own_allocation + 2*subsession.session.par_delta*p1.nbs_allocation print('p1 group account', p1.group_account) if p1.group_account == 0: p1.payoff = subsession.session.par_r * (subsession.session.par_v * p1.private_account) print('p1 payoff', p1.payoff) else: p1.payoff = subsession.session.par_r * (subsession.session.par_v * (p1.private_account) + (p1.own_allocation / p1.group_account) * (subsession.session.par_a * (p1.group_account) - subsession.session.par_b * (p1.group_account) ** 2) + subsession.session.par_h * (p1.nbs_allocation)) print('p1 payoff', p1.payoff) # player 2 p2.nbs_allocation = C.g21*p1.own_allocation + C.g23*p3.own_allocation + C.g24*p4.own_allocation + C.g25*p5.own_allocation + C.g26*p6.own_allocation print('p2 nbs allocation', p2.nbs_allocation) p2.private_account = subsession.session.endowment - p2.own_allocation print('p2 private account', p2.private_account) if subsession.session.provision == 1: p2.group_account = p2.own_allocation + subsession.session.par_delta * p2.nbs_allocation print('p2 group account', p2.group_account) p2.payoff = subsession.session.par_r * (subsession.session.par_v * (p2.private_account) + subsession.session.par_a * (p2.group_account) - subsession.session.par_b * (p2.group_account) ** 3 + subsession.session.par_h * (p2.nbs_allocation)) print('p2 payoff', p2.payoff) else: p2.group_account = p2.own_allocation + 2*subsession.session.par_delta*p2.nbs_allocation print('p2 group account', p2.group_account) if p2.group_account == 0: p2.payoff = subsession.session.par_r * (subsession.session.par_v * p2.private_account) print('p2 payoff', p2.payoff) else: p2.payoff = subsession.session.par_r * (subsession.session.par_v * (p2.private_account) + (p2.own_allocation / p2.group_account) * (subsession.session.par_a * (p2.group_account) - subsession.session.par_b * (p2.group_account) ** 2) + subsession.session.par_h * (p2.nbs_allocation)) print('p2 payoff', p2.payoff) # player 3 p3.nbs_allocation = C.g31*p1.own_allocation + C.g32*p2.own_allocation + C.g34*p4.own_allocation + C.g35*p5.own_allocation + C.g36*p6.own_allocation print('p3 nbs allocation', p3.nbs_allocation) p3.private_account = subsession.session.endowment - p3.own_allocation print('p3 private account', p3.private_account) if subsession.session.provision == 1: p3.group_account = p3.own_allocation + subsession.session.par_delta * p3.nbs_allocation print('p3 group account', p3.group_account) p3.payoff = subsession.session.par_r * (subsession.session.par_v * (p3.private_account) + subsession.session.par_a * (p3.group_account) - subsession.session.par_b * (p3.group_account) ** 3 + subsession.session.par_h * (p3.nbs_allocation)) print('p3 payoff', p3.payoff) else: p3.group_account = p3.own_allocation + 2 * subsession.session.par_delta * p3.nbs_allocation print('p3 group account', p3.group_account) if p3.group_account == 0: p3.payoff = subsession.session.par_r * (subsession.session.par_v * p3.private_account) print('p3 payoff', p3.payoff) else: p3.payoff = subsession.session.par_r * (subsession.session.par_v * (p3.private_account) + (p3.own_allocation / p3.group_account) * (subsession.session.par_a * (p3.group_account) - subsession.session.par_b * (p3.group_account) ** 2) + subsession.session.par_h * (p3.nbs_allocation)) print('p3 payoff', p3.payoff) # player 4 p4.nbs_allocation = C.g41*p1.own_allocation + C.g42*p2.own_allocation + C.g43*p3.own_allocation + C.g45*p5.own_allocation + C.g46*p6.own_allocation print('p4 nbs allocation', p4.nbs_allocation) p4.private_account = subsession.session.endowment - p4.own_allocation print('p4 private account', p4.private_account) if subsession.session.provision == 1: p4.group_account = p4.own_allocation + subsession.session.par_delta * p4.nbs_allocation print('p4 group account', p4.group_account) p4.payoff = subsession.session.par_r * (subsession.session.par_v * (p4.private_account) + subsession.session.par_a * (p4.group_account) - subsession.session.par_b * (p4.group_account) ** 3 + subsession.session.par_h * (p4.nbs_allocation)) print('p4 payoff', p4.payoff) else: p4.group_account = p4.own_allocation + 2 * subsession.session.par_delta * p4.nbs_allocation print('p4 group account', p4.group_account) if p4.group_account == 0: p4.payoff = subsession.session.par_r * (subsession.session.par_v * p4.private_account) print('p4 payoff', p4.payoff) else: p4.payoff = subsession.session.par_r * (subsession.session.par_v * (p4.private_account) + (p4.own_allocation / p4.group_account) * (subsession.session.par_a * (p4.group_account) - subsession.session.par_b * (p4.group_account) ** 2) + subsession.session.par_h * (p4.nbs_allocation)) print('p4 payoff', p4.payoff) # player 5 p5.nbs_allocation = C.g51 * p1.own_allocation + C.g52 * p2.own_allocation + C.g53 * p3.own_allocation + C.g54 * p4.own_allocation + C.g56 * p6.own_allocation print('p5 nbs allocation', p5.nbs_allocation) p5.private_account = subsession.session.endowment - p5.own_allocation print('p5 private account', p5.private_account) if subsession.session.provision == 1: p5.group_account = p5.own_allocation + subsession.session.par_delta * p5.nbs_allocation print('p5 group account', p5.group_account) p5.payoff = subsession.session.par_r * (subsession.session.par_v * (p5.private_account) + subsession.session.par_a * (p5.group_account) - subsession.session.par_b * (p5.group_account) ** 3 + subsession.session.par_h * (p5.nbs_allocation)) print('p5 payoff', p5.payoff) else: p5.group_account = p5.own_allocation + 2 * subsession.session.par_delta * p5.nbs_allocation print('p5 group account', p5.group_account) if p5.group_account == 0: p5.payoff = subsession.session.par_r * (subsession.session.par_v * p5.private_account) print('p5 payoff', p5.payoff) else: p5.payoff = subsession.session.par_r * (subsession.session.par_v * (p5.private_account) + (p5.own_allocation / p5.group_account) * (subsession.session.par_a * (p5.group_account) - subsession.session.par_b * (p5.group_account) ** 2) + subsession.session.par_h * (p5.nbs_allocation)) print('p5 payoff', p5.payoff) # player 6 p6.nbs_allocation = C.g61 * p1.own_allocation + C.g62 * p2.own_allocation + C.g63 * p3.own_allocation + C.g64 * p4.own_allocation + C.g65 * p5.own_allocation print('p6 nbs allocation', p6.nbs_allocation) p6.private_account = subsession.session.endowment - p6.own_allocation print('p6 private account', p6.private_account) if subsession.session.provision == 1: p6.group_account = p6.own_allocation + subsession.session.par_delta * p6.nbs_allocation print('p6 group account', p6.group_account) p6.payoff = subsession.session.par_r * (subsession.session.par_v * (p6.private_account) + subsession.session.par_a * (p6.group_account) - subsession.session.par_b * (p6.group_account) ** 3 + subsession.session.par_h * (p6.nbs_allocation)) print('p6 payoff', p6.payoff) else: p6.group_account = p6.own_allocation + 2 * subsession.session.par_delta * p6.nbs_allocation print('p6 group account', p6.group_account) if p6.group_account == 0: p6.payoff = subsession.session.par_r * (subsession.session.par_v * p6.private_account) print('p6 payoff', p6.payoff) else: p6.payoff = subsession.session.par_r * (subsession.session.par_v * (p6.private_account) + (p6.own_allocation / p6.group_account) * (subsession.session.par_a * (p6.group_account) - subsession.session.par_b * (p6.group_account) ** 2) + subsession.session.par_h * (p6.nbs_allocation)) print('p6 payoff', p6.payoff)