import math import random import time import xlsxwriter from datetime import datetime from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) doc = """ This is a one-period public goods game with 3 players. """ class Constants(BaseConstants): name_in_url = 'Contest_ExperimentExc' players_per_group = 2 trialrounds = 1 actualrounds = 2 num_rounds = trialrounds+actualrounds instructions_template = 'Contest_ExperimentExc/instructions.html' # """Amount allocated to each player""" endowment = 10 multiplier = 20 award=30 random.Random(time.clock()) index = random.randint(trialrounds, trialrounds + actualrounds - 1) participationfee=5 num_of_interested=6 class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() for g in self.get_players(): g.beta=self.session.config['beta'] g.convertion_rate=self.session.config['convertion_rate'] def vars_for_admin_report(self): decisions = [ p.decision for p in self.get_players() if p.decision != None ] randomdraws = [ p.randomdraw for p in self.get_players() if p.randomdraw != None ] part1payments=[ p.part1_final_payment for p in self.get_players() if p.part1_final_payment != None ] return dict( decisions1=decisions, randomdraws1=randomdraws, part1payments1=part1payments ) def custom_export(self): players=self.get_players() # header row workbook = xlsxwriter.Workbook(self.session.config['name']+"Ses"+str(players[0].session_id)+'Date'+datetime.now().strftime("%H:%M:%S")+'.xlsx') worksheet = workbook.add_worksheet() for p in range(len(players)): allround=players[p].in_all_rounds() #Participant code worksheet.write(p+2, 0, players[p].participant.code) for rp in range(len(allround)): #Number of interseted variables so jump same number of columns jump=rp*Constants.num_of_interested #Which round selected for payment worksheet.write(len(players) + 3, 0, "Payment Round") worksheet.write(len(players) + 4, 0, Constants.index) #Print round number at the upper row if (allround[rp].round_number>Constants.trialrounds): for i in range(Constants.num_of_interested): worksheet.write(0, jump + i+1, (allround[rp].round_number-Constants.trialrounds)) else: for i in range(Constants.num_of_interested): worksheet.write(0, jump + i+1, "Trial"+str(allround[rp].round_number)) worksheet.write(1, jump + 1, "Effort") worksheet.write(p + 2, jump + 1, allround[rp].decision) worksheet.write(1, jump + 2, "Randomdraw") worksheet.write(p + 2, jump + 2, allround[rp].randomdraw) worksheet.write(1, jump + 3, "Performance") worksheet.write(p+2, jump+3, allround[rp].performance) worksheet.write(1, jump + 4, "RoundPayoff") worksheet.write(p + 2, jump + 4, allround[rp].payoff2) worksheet.write(1, jump + 5, "GroupId") worksheet.write(p + 2, jump + 5, allround[rp].group_id) worksheet.write(1, jump + 6, "RealPayment") worksheet.write(p + 2, jump + 6, allround[rp].part1_final_payment) workbook.close() class Group(BaseGroup): def set_payoffs(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) output_shock1=random.uniform(-p1.beta,p1.beta) output_shock2=random.uniform(-p1.beta,p1.beta) if(p1.decision==0 and p2.decision==0): p1.payoff2=Constants.endowment p2.payoff2 = Constants.endowment performance1 = -1000 performance2 = -1000 p1.is_winner2=True p2.is_winner2 = True elif(p1.decision==0 and p2.decision>0): p1.payoff2 = Constants.endowment p2.payoff2 = Constants.award+Constants.endowment- p2.decision performance1 = -1000 performance2 = Constants.multiplier * math.log(p2.decision) + output_shock2 p2.is_winner = True elif(p1.decision>0 and p2.decision==0): p1.payoff2 = Constants.award+Constants.endowment- p1.decision p2.payoff2 = Constants.endowment performance1 = Constants.multiplier * math.log(p1.decision) + output_shock1 performance2 = -1000 p1.is_winner = True elif(p1.decision>0 and p2.decision>0): performance1=Constants.multiplier*math.log(p1.decision)+output_shock1 performance2 = Constants.multiplier * math.log(p2.decision) + output_shock2 if performance1>performance2: p1.payoff2=(Constants.award+Constants.endowment-p1.decision) p2.payoff2 = (Constants.endowment-p2.decision) p1.is_winner=True else: p2.payoff2 = (Constants.award + Constants.endowment - p2.decision) p1.payoff2 = (Constants.endowment - p1.decision) p2.is_winner=True p1.performance=round(performance1,2) p2.performance = round(performance2, 2) p1.payoff2 = round(p1.payoff2, 2) p2.payoff2 = round(p2.payoff2, 2) p1.randomdraw = round(output_shock1, 2) p2.randomdraw = round(output_shock2, 2) for p in [p1,p2]: if ( p.round_number > Constants.trialrounds and p.round_number < Constants.trialrounds + Constants.actualrounds): final = ((p.round_number-Constants.trialrounds) * Constants.participationfee / Constants.actualrounds) final=round(final,2) p.part1_final_payment = final elif (p.round_number == Constants.trialrounds + Constants.actualrounds): index = Constants.index roundlist = p.in_all_rounds() payment = roundlist[index].payoff2 final = Constants.participationfee + p.convertion_rate*payment final=round(final,2) p.part1_final_payment=final class Player(BasePlayer): convertion_rate= models.FloatField(initial=0) beta = models.FloatField(initial=0) performance = models.FloatField(initial=0) randomdraw = models.FloatField(initial=0) total_earnings = models.FloatField(initial=0 ) part1_final_payment= models.FloatField(initial=0 ) payoff2 = models.FloatField(initial=0) is_winner = models.BooleanField(initial=False) is_winner2 = models.BooleanField(initial=False) decision = models.FloatField(initial=0, min=0, max=Constants.endowment )