from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) doc = """ This is two-period non-clairvoyant dynamic mechanism desgin in the single buyer case. It has 2-approximation. Mirrokni et al.,2020 . """ class Constants(BaseConstants): name_in_url = 'Non_clairvoyant_dynamic' players_per_group = None num_rounds = 1 instructions_template = 'Non_clairvoyant_dynamic/instructions.html' # Initial amount allocated to each player max_value = c(32) min_value = c(2) mean_value = c(6) endowment = c(100) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): reserve_m_1 = models.CurrencyField(initial=8) # reserve price in Myerson's in period 1 reserve_m_2 = models.CurrencyField(initial=8) # reserve price in Myerson's in period 2 value_1 = models.CurrencyField() # value in period 1 value_2 = models.CurrencyField() # value in Myerson's in period 2 reserve_p_2 = models.CurrencyField(initial=8) # reserve price in Post price in period 2 upfront_2 = models.CurrencyField() # membership fee in Post price in period 2 random_m_1 = models.IntegerField() # Myerson's acution == 1 random_m_2 = models.IntegerField() # Myerson's acution == 1 reserve_2 = models.CurrencyField(initial=8) # reserve price =(m or p) in period 2 profit_1 = models.CurrencyField() # Buyer's profit in period 1 profit_2 = models.CurrencyField() # Buyer's profit in period 2 profit = models.CurrencyField() # Buyer's profit in total get_1 = models.IntegerField() # Trade happened in period 1 get_2 = models.IntegerField() # Trade happened in period 2 revenue_1 = models.CurrencyField() # Seller's revenue in period 1 revenue_2 = models.CurrencyField() # Seller's revenue in period 2 account_1 = models.CurrencyField() # account in the end of period 1 account_2 = models.CurrencyField() # account in the end of period 2 getmyerson_1 = models.IntegerField(initial=0) getmyerson_2 = models.IntegerField(initial=0) getpost_2 = models.IntegerField(initial=0) bid_1 = models.CurrencyField( min=0, max=Constants.max_value, doc="""Set a bid for period 1""", label="Please enter an amount from 0 to 32:", ) enter_2 = models.BooleanField( choices=[ [False, 'No. Quit and leave'], [True, 'Yes. Pay and enter'], ] ) bid_2 = models.CurrencyField( min=0, max=Constants.max_value, doc="""Set a bid for period 2""", label="Please enter an amount from 0 to 32:", ) def get_value_1(self): import random random1 = random.randint(0,15) self.random_m_1 = random.randint(0,1) # Myerson's acution == 1 if random1 < 8: self.value_1 = 2 elif random1 < 12 : self.value_1 = 4 elif random1 < 14: self.value_1 = 8 elif random1 < 15 : self.value_1 = 16 else: self.value_1 = 32 def get_result_1(self): if self.bid_1 >= self.reserve_m_1: self.getmyerson_1 = 1 else: self.getmyerson_1 = 0 self.get_1 = (1 - self.random_m_1) + self.random_m_1 * self.getmyerson_1 self.profit_1 = (1 - self.random_m_1) * self.value_1 + self.random_m_1 * self.getmyerson_1 * (self.value_1 - self.reserve_m_1) self.account_1 = Constants.endowment + self.profit_1 self.revenue_1 = self.random_m_1 * self.getmyerson_1 * self.reserve_m_1 def get_prices_value_2(self): self.upfront_2 = min(self.bid_1, Constants.mean_value) if self.bid_1 >= Constants.mean_value: self.reserve_p_2 = 0 elif self.bid_1 < 1: self.reserve_p_2 = 1 * (2 - self.bid_1) elif self.bid_1 < 2: self.reserve_p_2 = 8 * (3 - self.bid_1) elif self.bid_1 < 3: self.reserve_p_2 = 4 * (4 - self.bid_1) elif self.bid_1 < 4: self.reserve_p_2 = 2 * (5 - self.bid_1) else: self.reserve_p_2 = 6 - self.bid_1 import random self.random_m_2 = random.randint(0, 1) # Myerson's == 1 random2 = random.randint(0,15) if random2 < 8: self.value_2 = 2 elif random2 < 12 : self.value_2 = 4 elif random2 < 14: self.value_2 = 8 elif random2 < 15 : self.value_2 = 16 else: self.value_2 = 32 if self.random_m_2 == 1 : self.reserve_2 = self.reserve_m_2 else: self.reserve_2 = self.reserve_p_2 def get_result_2(self): if self.enter_2 == 1: if self.bid_2 >= self.reserve_m_2: self.getmyerson_2 = 1 else: self.getmyerson_2 = 0 if self.bid_2 >= self.reserve_p_2: self.getpost_2 = 1 else: self.getpost_2 = 0 self.profit_2 = (1 - self.random_m_2) * ( - self.upfront_2 + self.getpost_2 * (self.value_2 - self.reserve_2 )) + self.random_m_2 * self.getmyerson_2 * ( self.value_2 - self.reserve_m_2) self.get_2 = (1 - self.random_m_2) * self.getpost_2 + self.random_m_2 * self.getmyerson_2 self.revenue_2 = self.upfront_2 + ( 1 - self.random_m_2 ) * self.getpost_2 * self.reserve_p_2 + self.random_m_2 * self.getmyerson_2 * self.reserve_m_2 else: self.profit_2 = 0 self.get_2 = 0 self.revenue_2 = 0 self.account_2 = self.account_1 + self.profit_2 self.profit = self.profit_1 + self.profit_2