from otree.api import (
models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer,
Currency as c, currency_range, Page, WaitPage
)
cu = c
doc = '\nIn a common value auction game, players simultaneously bid on the item being\nauctioned.
\nPrior to bidding, they are given an estimate of the actual value of the item.\nThis actual value is revealed after the bidding.
\nBids are private. The player with the highest bid wins the auction, but\npayoff depends on the bid amount and the actual value.
\n'
class Constants(BaseConstants):
name_in_url = 'common_value_auction_realized'
players_per_group = None
num_rounds = 1
min_allowable_bid = c(0)
max_allowable_bid = c(12.5)
instructions_template = 'common_value_auction_realized/instructions.html'
def creating_session(subsession):
pass
class Subsession(BaseSubsession):
creating_session = creating_session
def set_winner_Type1(group):
import random
players = group.get_players()
for p in players:
p.available_funds = 12.5
playerbidnumber = max([p.id_in_group for p in players])
allbids = []
firstcount = 0
othercount = 0
while firstcount < playerbidnumber:
freshplayer = firstcount + 1
currentperson = group.get_player_by_id(freshplayer)
while othercount < currentperson.number_Type1:
allbids.append(currentperson.bid_amount_type1)
othercount = othercount + 1
firstcount = firstcount + 1
othercount = 0
bidsinorder = sorted(allbids, reverse=True)
counter = 0
endcheck = 0
totalbids = 0
for p in players:
if p.bid_amount_type1 > 0:
totalbids = totalbids + p.number_Type1
if totalbids < playerbidnumber:
for p in players:
if p.bid_amount_type1 > 0 and p.number_Type1 > 0:
p.owned_type1 = p.number_Type1
counter = counter + p.number_Type1
else:
p.owned_type1 = 1
counter = counter + 1
players_with_marginal_bid = [p for p in players if p.bid_amount_type1 == 0 or p.number_Type1 == 0]
while counter < playerbidnumber*2:
receiver = random.choice(players)
if receiver.owned_type1 < 4:
receiver.owned_type1 = receiver.owned_type1 + 1
counter = counter + 1
endcheck = 3
print('Insufficient bids')
if totalbids >= playerbidnumber:
for p in players:
if p.bid_amount_type1 > bidsinorder[playerbidnumber-1]:
p.owned_type1 = p.number_Type1
counter = counter + p.number_Type1
elif p.bid_amount_type1 == bidsinorder[playerbidnumber-1]:
p.owned_type1 = p.number_Type1
counter = counter + p.number_Type1
players_with_marginal_bid = [
p for p in players if p.bid_amount_type1 == bidsinorder[playerbidnumber-1]
]
else:
p.owned_type1 = 0
endcheck = 1
if counter > playerbidnumber:
while counter > playerbidnumber:
winner = random.choice(
players_with_marginal_bid
) # if tie, winner is chosen at random
winner.owned_type1 = winner.owned_type1 - 1
if winner.owned_type1 > - 1:
counter = counter - 1
else:
winner.owned_type1 = 0
for p in players:
if endcheck == 1:
p.auction_spending1 = p.owned_type1*bidsinorder[playerbidnumber-1]
p.asset1auctionprice = bidsinorder[playerbidnumber-1]
if endcheck == 3:
p.auction_spending1 = 0
p.asset1auctionprice = 0
def set_winner_Type2(group):
import random
players = group.get_players()
playerbidnumber = max([p.id_in_group for p in players])
allbids = []
firstcount = 0
othercount = 0
while firstcount < playerbidnumber:
freshplayer = firstcount + 1
currentperson = group.get_player_by_id(freshplayer)
while othercount < currentperson.number_Type2:
allbids.append(currentperson.bid_amount_type2)
othercount = othercount + 1
firstcount = firstcount + 1
othercount = 0
bidsinorder = sorted(allbids, reverse=True)
counter = 0
endcheck = 0
totalbids = 0
for p in players:
if p.bid_amount_type2 > 0:
totalbids = totalbids + p.number_Type2
if totalbids < playerbidnumber:
for p in players:
if p.bid_amount_type2 > 0 and p.number_Type2 > 0:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
else:
p.owned_type2 = 1
counter = counter + 1
players_with_marginal_bid = [p for p in players if p.bid_amount_type2 == 0 or p.number_Type2 == 0]
while counter < playerbidnumber:
receiver = random.choice(players)
if receiver.owned_type2 < 4:
receiver.owned_type2 = receiver.owned_type2 + 1
counter = counter + 1
endcheck = 3
if totalbids >= playerbidnumber:
for p in players:
if p.bid_amount_type2 > bidsinorder[playerbidnumber-1]:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
elif p.bid_amount_type2 == bidsinorder[playerbidnumber-1]:
p.owned_type2 = p.number_Type2
counter = counter + p.number_Type2
players_with_marginal_bid = [
p for p in players if p.bid_amount_type2 == bidsinorder[playerbidnumber-1]
]
else:
p.owned_type2 = 0
endcheck = 1
if counter > playerbidnumber:
while counter > playerbidnumber:
winner = random.choice(
players_with_marginal_bid
) # if tie, winner is chosen at random
winner.owned_type2 = winner.owned_type2 - 1
if winner.owned_type2 > - 1:
counter = counter - 1
else:
winner.owned_type2 = 0
for p in players:
if endcheck == 1:
p.auction_spending2 = p.owned_type2*bidsinorder[playerbidnumber-1]
p.asset2auctionprice = bidsinorder[playerbidnumber-1]
if endcheck == 3:
p.auction_spending2 = 0
p.asset2auctionprice = 0
p.initial_spending = p.auction_spending1 + p.auction_spending2
p.available_funds = p.available_funds - p.initial_spending
def my_function(group):
players = group.get_players()
for p in players:
set_this_data(p)
def create_outcome(group):
import random
players = group.get_players()
asset1gen = random.random()
asset2gen = random.random()
if asset1gen > .5:
group.asset1outcome = "Asset 1 earned 25 cents."
for p in players:
p.available_funds = p.available_funds + .25*p.owned_type1
p.asset1earningschange = .25*p.owned_type1
p.asset1endvalue = 2.5
else:
group.asset1outcome = "Asset 1 lost 25 cents."
for p in players:
p.available_funds = p.available_funds - .25*p.owned_type1
p.asset1earningschange = -.25*p.owned_type1
p.asset1endvalue = 2.5
if asset2gen < .1:
group.asset2outcome = "Asset 2 earned 90 cents."
for p in players:
p.available_funds = p.available_funds + .9*p.owned_type2
p.asset2earningschange = .9*p.owned_type2
p.asset2endvalue = 2.5
else:
group.asset2outcome = "Asset 2 lost 10 cents."
for p in players:
p.available_funds = p.available_funds - .1*p.owned_type2
p.asset2earningschange = -.1*p.owned_type2
p.asset2endvalue = 2.50
def showround2data(group):
players = group.get_players()
for p in players:
pull_round2data(p)
class Group(BaseGroup):
item_value = models.CurrencyField(doc='Common value of the item to be auctioned random for treatment')
highest_bid = models.CurrencyField()
u = models.IntegerField()
asset1outcome = models.StringField()
asset2outcome = models.StringField()
set_winner_Type1 = set_winner_Type1
set_winner_Type2 = set_winner_Type2
my_function = my_function
create_outcome = create_outcome
showround2data = showround2data
def set_this_data(player):
participant = player.participant
participant.vars['type1'] = player.owned_type1
participant.vars['type2'] = player.owned_type2
participant.vars['funds'] = 12.50
participant.vars['bankedaccount'] = player.available_funds
participant.vars['asset1value'] = player.asset1endvalue
participant.vars['asset2value'] = player.asset2endvalue
participant.vars['asset1auctionprice'] = player.asset1auctionprice
participant.vars['asset2auctionprice'] = player.asset2auctionprice
participant.vars['purchasehistory'] = player.purchasehistory
participant.vars['purchasehistory2'] = player.purchasehistory2
def pull_round2data(player):
participant = player.participant
player.previousearnings2 = participant.vars['round2earnings']
player.bankedaccountprev2 = participant.vars['round2bankedaccount']
player.available_fundsprev2 = participant.vars['round2availablefunds']
player.owned_type2prev2 = participant.vars['round2ownedtype2']
player.asset2valueprev2 = participant.vars['round2asset2value']
class Player(BasePlayer):
bid_amount_type1 = models.CurrencyField(doc='Amount bidded by the player', label='Bid amount for Type 1 Assets', max=Constants.max_allowable_bid, min=Constants.min_allowable_bid)
number_Type1 = models.IntegerField(label='Number of Type 1 Assets to purchase (maximum)', max=2, min=0)
bid_amount_type2 = models.CurrencyField(label='Bid amount for Type 2 Assets', max=Constants.max_allowable_bid, min=0)
number_Type2 = models.IntegerField(label='Number of Type 2 Assets to purchase (maximum)', max=2, min=0)
initial_spending = models.CurrencyField()
owned_type1 = models.IntegerField(initial=0)
owned_type2 = models.IntegerField(initial=0)
auction_spending1 = models.CurrencyField()
auction_spending2 = models.CurrencyField()
available_funds = models.CurrencyField(initial=12.5)
asset1endvalue = models.CurrencyField()
asset2endvalue = models.CurrencyField()
asset1auctionprice = models.CurrencyField()
asset2auctionprice = models.CurrencyField()
purchasehistory = models.LongStringField(initial='Nothing')
purchasehistory2 = models.LongStringField(initial='Nothing')
previousearnings2 = models.CurrencyField()
bankedaccountprev2 = models.CurrencyField()
available_fundsprev2 = models.CurrencyField()
owned_type2prev2 = models.IntegerField()
asset2valueprev2 = models.CurrencyField()
asset1earningschange = models.CurrencyField(initial=0)
asset2earningschange = models.CurrencyField(initial=0)
set_this_data = set_this_data
pull_round2data = pull_round2data