from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import math author = 'Fernando Brito, UID 116210904, Graduate student.' doc = """Cap and Trade""" class Constants(BaseConstants): name_in_url = 'cap_and_trade' players_per_group = 2 num_rounds = 5 cap = 150 class Subsession(BaseSubsession): endowment = models.IntegerField(initial=random.randint(0,Constants.cap/2)) def creating_session(self): if self.round_number == 1: for g in self.get_groups(): g.get_player_by_id('1').permits = +self.endowment g.get_player_by_id('2').permits = -self.endowment + Constants.cap g.get_player_by_id('1').production = math.floor(math.sqrt(g.get_player_by_id('1').permits)) g.get_player_by_id('2').production = math.floor(math.sqrt(g.get_player_by_id('2').permits)) class Group(BaseGroup): q=models.IntegerField(min=0) p=models.IntegerField(min=0,max=100) a=models.BooleanField(default=False) l=models.IntegerField(min=0,max=100) r=models.FloatField() def q_max(self): return self.get_player_by_role('Seller').permits def set_payoffs(self): self.l = Constants.num_rounds-self.round_number+1 b = self.get_player_by_role('Buyer') s = self.get_player_by_role('Seller') if self.p != None: self.r = round(self.p/self.q,2) else: self.r = round(0) if self.round_number == 1: if self.a == True: b.permits = b.permits+self.q s.permits = s.permits-self.q b.production = math.floor(math.sqrt(b.permits)) s.production = math.floor(math.sqrt(s.permits)) b.profit = b.production-self.p s.profit = s.production+self.p else: b.permits = b.permits s.permits = s.permits b.production = math.floor(math.sqrt(b.permits)) s.production = math.floor(math.sqrt(s.permits)) b.profit = b.production s.profit = s.production else: if self.a == True: b.permits = b.in_round(self.round_number-1).permits+self.q s.permits = s.in_round(self.round_number-1).permits-self.q b.production = math.floor(math.sqrt(b.permits)) s.production = math.floor(math.sqrt(s.permits)) b.profit = b.production-self.p s.profit = s.production+self.p else: b.permits = b.in_round(self.round_number-1).permits s.permits = s.in_round(self.round_number-1).permits b.production = math.floor(math.sqrt(b.permits)) s.production = math.floor(math.sqrt(s.permits)) b.profit = b.production s.profit = s.production class Player(BasePlayer): permits = models.IntegerField(min=0,max=Constants.cap) production = models.IntegerField(min=0,max=12) profit = models.IntegerField() def role(self): if self.round_number == 1: if self.id_in_group == 1: return 'Buyer' if self.id_in_group == 2: return 'Seller' else: if self.in_round(self.round_number-1).permits < Constants.cap/2: return 'Buyer' else: return 'Seller'