from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Revision_Game' players_per_group = None num_rounds = 60 class Subsession(BaseSubsession): pass def assign_revision(group): session = group.session import math import random lamb = float(session.config['arrival_rate_of_revision_opportunity']) rand = random.uniform(0,1) x = math.log(1 - rand) / (-1 * lamb) if int(x) == 0: x = 1 players = group.get_players() for each in players: each.revision = int(x) group.past_revision = int(x) if group.round_number == 1: group.current_time = int(x) else: group.current_time = group.in_round(group.round_number - 1).current_time + int(x) class Group(BaseGroup): current_time = models.IntegerField(initial=0) past_revision = models.IntegerField(initial=0) assign_revision = assign_revision class Player(BasePlayer): revision = models.IntegerField() Action = models.FloatField() init_Action = models.FloatField() class Initial_Action(Page): form_model = 'player' form_fields = ['init_Action'] @staticmethod def is_displayed(player): return player.round_number == 1 class Wait_for_init(WaitPage): after_all_players_arrive = 'assign_revision' @staticmethod def is_displayed(player): session = player.session group = player.group player.group return group.current_time < session.config['duration_of_the_game'] class Revision_wait(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session group = player.group player.group return group.current_time < session.config['duration_of_the_game'] @staticmethod def js_vars(player): session = player.session group = player.group vertical_grey = "" for each_round in group.in_previous_rounds(): if each_round.round_number == 1: vertical_grey = vertical_grey + str(each_round.current_time) else: vertical_grey = vertical_grey + "," + str(each_round.current_time) if group.round_number == 1: vertical_grey = vertical_grey + str(group.current_time) else: vertical_grey = vertical_grey + "," + str(group.current_time) # p1 = green # p2 = blue # p3 = yellow # p4 = red p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p1_actions = "" p2_actions = "" p3_actions = "" p4_actions = "" p1_actions = p1_actions + str(p1.in_round(1).init_Action) p2_actions = p2_actions + str(p2.in_round(1).init_Action) p3_actions = p3_actions + str(p3.in_round(1).init_Action) p4_actions = p4_actions + str(p4.in_round(1).init_Action) pp1 = 1 pp2 = 1 pp3 = 1 pp4 = 1 while pp1 < group.in_round(1).current_time: p1_actions = p1_actions + "," + str(p1.in_round(1).init_Action) pp1 = pp1 + 1 while pp2 < group.in_round(1).current_time: p2_actions = p2_actions + "," + str(p2.in_round(1).init_Action) pp2 = pp2 + 1 while pp3 < group.in_round(1).current_time: p3_actions = p3_actions + "," + str(p3.in_round(1).init_Action) pp3 = pp3 + 1 while pp4 < group.in_round(1).current_time: p4_actions = p4_actions + "," + str(p4.in_round(1).init_Action) pp4 = pp4 + 1 round_p1 = 0 round_p2 = 0 round_p3 = 0 round_p4 = 0 for each_round in p1.in_previous_rounds(): round_p1 = round_p1 + 1 pppp1 = 0 while pppp1 < (group.in_round(round_p1 + 1).current_time - group.in_round(round_p1).current_time): pppp1 = pppp1 + 1 p1_actions = p1_actions + "," + str(each_round.Action) for each_round in p2.in_previous_rounds(): round_p2 = round_p2 + 1 pppp2 = 0 while pppp2 < (group.in_round(round_p2 + 1).current_time - group.in_round(round_p2).current_time): pppp2 = pppp2 + 1 p2_actions = p2_actions + "," + str(each_round.Action) for each_round in p3.in_previous_rounds(): round_p3 = round_p3 + 1 pppp3 = 0 while pppp3 < (group.in_round(round_p3 + 1).current_time - group.in_round(round_p3).current_time): pppp3 = pppp3 + 1 p3_actions = p3_actions + "," + str(each_round.Action) for each_round in p4.in_previous_rounds(): round_p4 = round_p4 + 1 pppp4 = 0 while pppp4 < (group.in_round(round_p4 + 1).current_time - group.in_round(round_p4).current_time): pppp4 = pppp4 + 1 p4_actions = p4_actions + "," + str(each_round.Action) # calculate payoff # p = 2 total = 0 if player.round_number == 1: total = total + (p1.in_round(1).init_Action ** 2) total = total + (p2.in_round(1).init_Action ** 2) total = total + (p3.in_round(1).init_Action ** 2) total = total + (p4.in_round(1).init_Action ** 2) else: total = total + (p1.in_round(player.round_number - 1).Action ** 2) total = total + (p2.in_round(player.round_number - 1).Action ** 2) total = total + (p3.in_round(player.round_number - 1).Action ** 2) total = total + (p4.in_round(player.round_number - 1).Action ** 2) mycolor = "" if player.id_in_group == 1: mycolor = "blue" if player.id_in_group == 2: mycolor = "green" if player.id_in_group == 3: mycolor = "red" if player.id_in_group == 4: mycolor = "yellow" return dict( time_line = vertical_grey, p1_act = p1_actions, p2_act = p2_actions, p3_act = p3_actions, p4_act = p4_actions, sub_count = group.current_time, max_time = session.config['duration_of_the_game'], tot = total ** 0.5, mycol = mycolor, period = player.revision, current_round = player.round_number) class Revision_Page(Page): form_model = 'player' form_fields = ['Action'] @staticmethod def is_displayed(player): session = player.session group = player.group player.group return group.current_time < session.config['duration_of_the_game'] @staticmethod def js_vars(player): session = player.session group = player.group vertical_grey = "" for each_round in group.in_previous_rounds(): if each_round.round_number == 1: vertical_grey = vertical_grey + str(each_round.current_time) else: vertical_grey = vertical_grey + "," + str(each_round.current_time) if group.round_number == 1: vertical_grey = vertical_grey + str(group.current_time) else: vertical_grey = vertical_grey + "," + str(group.current_time) # p1 = green # p2 = blue # p3 = yellow # p4 = red p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p1_actions = "" p2_actions = "" p3_actions = "" p4_actions = "" p1_actions = p1_actions + str(p1.in_round(1).init_Action) p2_actions = p2_actions + str(p2.in_round(1).init_Action) p3_actions = p3_actions + str(p3.in_round(1).init_Action) p4_actions = p4_actions + str(p4.in_round(1).init_Action) pp1 = 1 pp2 = 1 pp3 = 1 pp4 = 1 while pp1 < group.in_round(1).current_time: p1_actions = p1_actions + "," + str(p1.in_round(1).init_Action) pp1 = pp1 + 1 while pp2 < group.in_round(1).current_time: p2_actions = p2_actions + "," + str(p2.in_round(1).init_Action) pp2 = pp2 + 1 while pp3 < group.in_round(1).current_time: p3_actions = p3_actions + "," + str(p3.in_round(1).init_Action) pp3 = pp3 + 1 while pp4 < group.in_round(1).current_time: p4_actions = p4_actions + "," + str(p4.in_round(1).init_Action) pp4 = pp4 + 1 round_p1 = 0 round_p2 = 0 round_p3 = 0 round_p4 = 0 for each_round in p1.in_previous_rounds(): round_p1 = round_p1 + 1 pppp1 = 0 while pppp1 < (group.in_round(round_p1 + 1).current_time - group.in_round(round_p1).current_time): pppp1 = pppp1 + 1 p1_actions = p1_actions + "," + str(each_round.Action) for each_round in p2.in_previous_rounds(): round_p2 = round_p2 + 1 pppp2 = 0 while pppp2 < (group.in_round(round_p2 + 1).current_time - group.in_round(round_p2).current_time): pppp2 = pppp2 + 1 p2_actions = p2_actions + "," + str(each_round.Action) for each_round in p3.in_previous_rounds(): round_p3 = round_p3 + 1 pppp3 = 0 while pppp3 < (group.in_round(round_p3 + 1).current_time - group.in_round(round_p3).current_time): pppp3 = pppp3 + 1 p3_actions = p3_actions + "," + str(each_round.Action) for each_round in p4.in_previous_rounds(): round_p4 = round_p4 + 1 pppp4 = 0 while pppp4 < (group.in_round(round_p4 + 1).current_time - group.in_round(round_p4).current_time): pppp4 = pppp4 + 1 p4_actions = p4_actions + "," + str(each_round.Action) # calculate payoff # p = 2 total = 0 if player.round_number == 1: total = total + (p1.in_round(1).init_Action ** 2) total = total + (p2.in_round(1).init_Action ** 2) total = total + (p3.in_round(1).init_Action ** 2) total = total + (p4.in_round(1).init_Action ** 2) else: total = total + (p1.in_round(player.round_number - 1).Action ** 2) total = total + (p2.in_round(player.round_number - 1).Action ** 2) total = total + (p3.in_round(player.round_number - 1).Action ** 2) total = total + (p4.in_round(player.round_number - 1).Action ** 2) mycolor = "" if player.id_in_group == 1: mycolor = "blue" if player.id_in_group == 2: mycolor = "green" if player.id_in_group == 3: mycolor = "red" if player.id_in_group == 4: mycolor = "yellow" if player.round_number == 1: previous_action = player.in_round(1).init_Action if player.round_number != 1: previous_action = player.in_round(player.round_number - 1).Action return dict( time_line = vertical_grey, p1_act = p1_actions, p2_act = p2_actions, p3_act = p3_actions, p4_act = p4_actions, sub_count = group.current_time, max_time = session.config['duration_of_the_game'], tot = total ** 0.5, mycol = mycolor, prev = previous_action ) class Finish_Page(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session group = player.group player.group return group.current_time >= session.config['duration_of_the_game'] class Backuppage(Page): form_model = 'player' @staticmethod def is_displayed(player): return False @staticmethod def js_vars(player): session = player.session group = player.group vertical_grey = "" for each_round in group.in_previous_rounds(): if each_round.round_number == 1: vertical_grey = vertical_grey + str(each_round.current_time) else: vertical_grey = vertical_grey + "," + str(each_round.current_time) if group.round_number == 1: vertical_grey = vertical_grey + str(group.current_time) else: vertical_grey = vertical_grey + "," + str(group.current_time) # p1 = green # p2 = blue # p3 = yellow # p4 = red p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p1_actions = "" p2_actions = "" p3_actions = "" p4_actions = "" p1_actions = p1_actions + str(p1.in_round(1).init_Action) p2_actions = p2_actions + str(p2.in_round(1).init_Action) p3_actions = p3_actions + str(p3.in_round(1).init_Action) p4_actions = p4_actions + str(p4.in_round(1).init_Action) for each_round in p1.in_previous_rounds(): p1_actions = p1_actions + "," + str(each_round.Action) for each_round in p2.in_previous_rounds(): p2_actions = p2_actions + "," + str(each_round.Action) for each_round in p3.in_previous_rounds(): p3_actions = p3_actions + "," + str(each_round.Action) for each_round in p4.in_previous_rounds(): p4_actions = p4_actions + "," + str(each_round.Action) # calculate payoff # p = 2 total = 0 if player.round_number == 1: total = total + (p1.in_round(1).init_Action ** 2) total = total + (p2.in_round(1).init_Action ** 2) total = total + (p3.in_round(1).init_Action ** 2) total = total + (p4.in_round(1).init_Action ** 2) else: total = total + (p1.in_round(player.round_number - 1).Action ** 2) total = total + (p2.in_round(player.round_number - 1).Action ** 2) total = total + (p3.in_round(player.round_number - 1).Action ** 2) total = total + (p4.in_round(player.round_number - 1).Action ** 2) return dict( time_line = vertical_grey, p1_act = p1_actions, p2_act = p2_actions, p3_act = p3_actions, p4_act = p4_actions, sub_count = player.round_number, max_time = session.config['duration_of_the_game'], tot = total ** 0.5) class RevisionWaitBackup(Page): form_model = 'player' @staticmethod def is_displayed(player): return False class RevisionWaitBackup2(Page): form_model = 'player' @staticmethod def is_displayed(player): return False page_sequence = [Initial_Action, Wait_for_init, Revision_wait, Revision_Page, Finish_Page, Backuppage, RevisionWaitBackup, RevisionWaitBackup2]