# -*- 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_run2' players_per_group = 10 num_rounds = 27 instructions_file = 'bank_run2/Instructions.html' num_other_players = players_per_group - 1 # """Payoff for each player if they get their deposit back""" deposit = c(1) # """Additional interest if they don't withdraw and no bank run""" R = c(2) r1 = c(1.11) r2 = c(1.54) r3 = c(1.82) 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() upper_withdraw = models.CurrencyField() upper_not_withdraw = models.CurrencyField() total_deposits = 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 <= 9: self.bank_holdings = self.total_deposits assert self.bank_holdings != None assert self.total_runs != None if 1<= self.total_runs <= 9: self.upper_withdraw = Constants.deposit*Constants.players_per_group/self.total_runs self.upper_not_withdraw = ((self.total_deposits - self.total_runs*Constants.r1)*Constants.R)/(self.total_deposits - self.total_runs) assert self.upper_withdraw != None assert self.upper_not_withdraw != None self.run_payoff = min(Constants.r1, self.upper_withdraw) for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = max(0, self.upper_not_withdraw) if self.total_runs == 0: self.run_payoff = c(0) for p in self.get_players(): p.payoff = Constants.R if p.withdraw: p.payoff = self.run_payoff if self.total_runs == 10: self.run_payoff = c(1) for p in self.get_players(): p.payoff = c(0) if p.withdraw: p.payoff = self.run_payoff if 10 <= self.subsession.round_number <=18: self.bank_holdings = self.total_deposits assert self.bank_holdings != None assert self.total_runs != None if 1<= self.total_runs <= 9: self.upper_withdraw = Constants.deposit*Constants.players_per_group/self.total_runs self.upper_not_withdraw = ((self.total_deposits - self.total_runs*Constants.r2)*Constants.R)/(self.total_deposits - self.total_runs) assert self.upper_withdraw != None assert self.upper_not_withdraw != None self.run_payoff = min(Constants.r2, self.upper_withdraw) for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = max(0, self.upper_not_withdraw) if self.total_runs == 0: self.run_payoff = c(0) for p in self.get_players(): p.payoff = Constants.R if p.withdraw: p.payoff = self.run_payoff if self.total_runs == 10: self.run_payoff = c(1) for p in self.get_players(): p.payoff = c(0) if p.withdraw: p.payoff = self.run_payoff if 19 <= self.subsession.round_number <=27: self.bank_holdings = self.total_deposits assert self.bank_holdings != None assert self.total_runs != None if 1<= self.total_runs <= 9: self.upper_withdraw = Constants.deposit*Constants.players_per_group/self.total_runs self.upper_not_withdraw = ((self.total_deposits - self.total_runs*Constants.r3)*Constants.R)/(self.total_deposits - self.total_runs) assert self.upper_withdraw != None assert self.upper_not_withdraw != None self.run_payoff = min(Constants.r3, self.upper_withdraw) for p in self.get_players(): if p.withdraw: p.payoff = self.run_payoff else: p.payoff = max(0, self.upper_not_withdraw) if self.total_runs == 0: self.run_payoff = c(0) for p in self.get_players(): p.payoff = Constants.R if p.withdraw: p.payoff = self.run_payoff if self.total_runs == 10: self.run_payoff = c(1) for p in self.get_players(): p.payoff = c(0) if p.withdraw: p.payoff = self.run_payoff class Player(BasePlayer): withdraw = models.BooleanField( doc="""Whether player withdraws""", )