from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random import csv from decimal import Decimal # import numpy as np from otree.models import player from decimal import Decimal as D import itertools class Constants(BaseConstants): name_in_url = 'trythis' num_rounds = 1 real_g1 = 1 real_g2 = 1 sender = 1 stimulated_players = 6 players_g2 = real_g2 + stimulated_players players_per_group = real_g1 + real_g2 + sender endowment = c(100) payoff_if_rejected = c(0) offer_increment = c(10) offer_choices = currency_range(0, endowment, offer_increment) pro_mean = 60 anti_mean = 20 TG_endowment = c(30) multiplication_factor = 3 class Subsession(BaseSubsession): def before_session_starts(self): # randomize to treatments for group in self.get_groups(): group.antisocial_group = random.choice([True, False]) # if 'treatment' in self.session.config: # g.antisocial_group = self.session.config['antisocial_group'] # else: # g.antisocial_group = random.choice([True, False]) # not_enough_players = models.BooleanField( # doc=""" this variable set to True when one of the players decide to # abandon the game (because he is tired to wait), and # there is not enough players left in the session to complete the group. # then those remaining get the opportunity to finish the game.""", # initial=False # ) def creating_session(self): treatments = itertools.cycle([True, False]) for p in self.get_groups(): p.antisocial_group = next(treatments) def question(amount): return 'Would you accept an offer of {}?'.format(c(amount)) def generate(mean,players,upper): list = [] listsum = 0 for i in range(players - 1): generated = random.randrange(0,upper,10) listsum += generated generate_c = c(generated) list.append(generate_c) if listsum > mean*players or listsum < (mean*players-upper): return generate(mean,players,upper) else: last_int = mean*players - listsum list.append(c(last_int)) return list class Group(BaseGroup): antisocial_group = models.BooleanField( doc="""Whether this group is prosocial""" ) offer_accepted = models.BooleanField( doc="if offered amount is accepted" ) amount_offered = [] p2_offered = models.CurrencyField( choices=currency_range(0, Constants.endowment, c(10)), widget=widgets.RadioSelectHorizontal()) p2_fairness = models.PositiveIntegerField( choices=range(1, 6, 1), widget=widgets.RadioSelectHorizontal()) amount_offered.append(p2_offered) # # # anti_stimulated = generate(Constants.anti_mean, Constants.stimulated_players, Constants.endowment) # print(anti_stimulated) # amount_offered.extend(anti_stimulated) if antisocial_group: stimulated_average = Constants.anti_mean else: stimulated_average = Constants.pro_mean stimulated_list = generate(stimulated_average, Constants.stimulated_players, Constants.endowment) amount_offered.extend(stimulated_list) # # # p3_offered = amount_offered[1] p4_offered = amount_offered[2] p5_offered = amount_offered[3] p6_offered = amount_offered[4] p7_offered = amount_offered[5] p8_offered = amount_offered[6] # p9_offered = amount_offered[7] # p10_offered = amount_offered[8] # p11_offered = amount_offered[9] # p12_offered = amount_offered[10]] # array = np.array(amount_offered[1:]) # cumsum = np.cumsum(array) # running_average = [] # for i in range(Constants.stimulated_players): # running_average.append(cumsum[i] / (i + 1)) # running_1 = running_average[0] # running_2 = running_average[1] # running_3 = running_average[2] # running_4 = running_average[3] # running_5 = running_average[4] # running_6 = running_average[5] # running_7 = running_average[6] # running_8 = running_average[7] # running_9 = running_average[8] # running_10 = running_average[9] def set_payoffs(self): p1, p2, p3 = self.get_players() total_offered = self.p2_offered + self.p3_offered + self.p4_offered + self.p5_offered + self.p6_offered \ + self.p7_offered + self.p8_offered # + self.p9_offered + self.p10_offered + self.p11_offered \ # + self.p12_offered if self.offer_accepted: p1.payoff = total_offered p2.payoff = Constants.endowment - self.p2_offered else: p1.payoff = Constants.payoff_if_rejected p2.payoff = Constants.payoff_if_rejected sent_amount = models.CurrencyField( min=0, max=Constants.TG_endowment, doc="""Amount sent by P1""", ) sent_back_amount = models.CurrencyField( doc="""Amount sent back by P2""", min=c(0), ) def tg_payoffs(self): p3 = self.get_player_by_id(3) p2 = self.get_player_by_id(2) p3.payoff = Constants.TG_endowment - self.sent_amount + self.sent_back_amount p2.payoff = self.sent_amount * Constants.multiplication_factor - self.sent_back_amount # # sent_amount = models.CurrencyField( # choices=currency_range(0, Constants.TG_endowment, c(5)), # widget=widgets.RadioSelectHorizontal(), # doc="""Amount sent by Sender""", # ) # # # sent_back_amount = models.CurrencyField( # doc="""Amount returned by Receiver""", # min=c(0), # widget=widgets.SliderInput(attrs={'step': c(5)}) # ) # # def tg_payoffs(self): # p1, p2, p3 = self.get_players() # p2.payoff = self.sent_amount * Constants.multiplication_factor - self.sent_back_amount # p3.payoff = Constants.TG_endowment - self.sent_amount + self.sent_back_amount class Player(BasePlayer): def role(self): return {1: 'g1', 2: 'Receiver', 3: 'Sender'}[self.id_in_group] startwp_timer_set = models.BooleanField(default=False) startwp_time = models.PositiveIntegerField() outofthegame = models.BooleanField() # def get_ug_decision(self): # return self.participant.vars['ug']= self.group.p2_offered