# -*- coding: utf-8 -*- # from __future__ import division from otree.db import models from otree.constants import BaseConstants from otree.models import BaseSubsession, BaseGroup, BasePlayer from otree import widgets from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) # doc = """ Each player decides if to free ride or to volunteer from which all will benefit. """ bibliography = ( ( "Diekmann, A. (1985). Volunteer's dilemma. Journal of Conflict " "Resolution, 605-610." ), ) class Constants(BaseConstants): name_in_url = 'bank_run' players_per_group = 3 num_rounds = 27 instructions_file = 'bank_run/Instructions.html' num_other_players = players_per_group - 1 # """Payoff for each player if they get their deposit back""" deposit = c(10) # """Additional interest if they don't withdraw and no bank run""" interest = c(10) threshold1 = c(100) threshold2 = c(0) threshold3 = c(85) threshold4 = c(15) threshold5 = c(75) threshold6 = c(25) threshold7 = c(60) threshold8 = c(40) threshold9 = c(50) class Subsession(BaseSubsession): pass class Group(BaseGroup): total_runs = models.CurrencyField() run_payoff = models.CurrencyField() bank_holdings = models.CurrencyField() def set_payoffs(self): self.total_deposits = Constants.deposit*Constants.players_per_group self.total_runs = len([p.withdraw for p in self.get_players() if p.withdraw]) if self.subsession.round_number <= 3: self.bank_holdings = self.total_deposits assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 4 <= self.subsession.round_number <=6: self.bank_holdings = self.total_deposits*0 assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > 0*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 7 <= self.subsession.round_number <=9: self.bank_holdings = self.total_deposits*(85/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (85/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 10 <= self.subsession.round_number <=12: self.bank_holdings = self.total_deposits*(15/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (15/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 13 <= self.subsession.round_number <=15: self.bank_holdings = self.total_deposits*(75/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (75/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 16 <= self.subsession.round_number <=18: self.bank_holdings = self.total_deposits*(25/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (25/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 19 <= self.subsession.round_number <=21: self.bank_holdings = self.total_deposits*(60/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (60/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 22 <= self.subsession.round_number <=24: self.bank_holdings = self.total_deposits*(40/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (40/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit if 25 <= self.subsession.round_number <=27: self.bank_holdings = self.total_deposits*(50/100) assert self.bank_holdings != None assert self.total_runs != None if self.total_runs >=1: self.run_payoff = self.bank_holdings/self.total_runs else: self.run_payoff = c(0) if self.total_runs > (50/100)*Constants.players_per_group: for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = c(0) else: for p in self.get_players(): p.payoff = Constants.deposit + Constants.interest if p.withdraw: p.payoff = Constants.deposit class Player(BasePlayer): withdraw = models.BooleanField( doc="""Whether player withdraws""", )