from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import numpy as np import random import math author = 'Huanren Zhang' doc = """ Payment information """ class Constants(BaseConstants): name_in_url = 'payment' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): def group_by_arrival_time_method(self, waiting_players): if len(waiting_players) >= 2: matched_players = waiting_players[:2] p1,p2 = matched_players print('Players are matched for EET:',p1,p2) p1.participant.vars['row_to_pay'].append(1) p2.participant.vars['row_to_pay'].append(2) p2.participant.vars['row_to_pay'] = p1.participant.vars['row_to_pay'] p1.payoff += (p1.participant.vars['row_to_pay'][1] if p1.participant.vars['row_to_pay'][5] == 'L' else p1.participant.vars['row_to_pay'][3]) p2.payoff += (p2.participant.vars['row_to_pay'][2] if p2.participant.vars['row_to_pay'][5] == 'L' else p2.participant.vars['row_to_pay'][4]) p1.participant.vars['eet_payoff'] = p1.payoff p2.participant.vars['eet_payoff'] = p2.payoff p1.participant.vars['proposer'] = True p2.participant.vars['proposer'] = False p1.participant.vars['finished'] = 1 p2.participant.vars['finished'] = 1 return matched_players if len(waiting_players)==1: players = self.get_players() incoming_players = [p for p in players if p.participant.vars.get('matched',0) and (not p.participant.vars.get('finished',0))] print('waiting_players',waiting_players,'incoming_players',incoming_players) if (len(incoming_players) == 1): # if there is only one player that cannot be matched p1, = incoming_players print('One player is matched for EET',p1) p1.participant.vars['row_to_pay'].append(1) p1.payoff += (p1.participant.vars['row_to_pay'][1] if p1.participant.vars['row_to_pay'][5] == 'L' else p1.participant.vars['row_to_pay'][3]) p1.participant.vars['eet_payoff'] = p1.payoff p1.participant.vars['proposer'] = True p1.participant.vars['finished'] = 1 return [p1] # players = self.get_players() # completed_players = np.array([p for p in players # if p.participant.vars.get('matched',0) and (not p.participant.vars.get('finished',0))]) # # print('waiting players:', len(waiting_players), ' completed players', len(completed_players)) # print('waiting players:',sorted([p.participant.id_in_session for p in waiting_players])) # print('completed players:',sorted([p.participant.id_in_session for p in completed_players])) # if len(waiting_players) == len(completed_players): # calculate bonus payment for lottery tickets # winning_prize = self.session.config.get('raffle_bonus', 20) # potential_winners = completed_players.copy() # tickets = np.array([p.participant.vars.get('tickets', 0) for p in potential_winners]) # if tickets.sum() > 0: # winner = np.random.choice(potential_winners, p=tickets / tickets.sum()) # winner.participant.vars['bonus'] = winning_prize # winner.payoff += winner.participant.vars['bonus'] # print('winner:',[winner], winner.payoff) # calculate eet payoff # random.shuffle(completed_players) # for i in range(0, len(completed_players), 2): # if i < len(waiting_players) - 1: # a group of 2 # p1,p2 = completed_players[i],completed_players[i+1] # print('Players are matched for EET:',p1,p2) # p1.participant.vars['row_to_pay'].append(1) # p2.participant.vars['row_to_pay'].append(2) # p2.participant.vars['row_to_pay'] = p1.participant.vars['row_to_pay'] # p1.payoff += (p1.participant.vars['row_to_pay'][1] if p1.participant.vars['row_to_pay'][5] == 'L' # else p1.participant.vars['row_to_pay'][3]) # p2.payoff += (p2.participant.vars['row_to_pay'][2] if p2.participant.vars['row_to_pay'][5] == 'L' # else p2.participant.vars['row_to_pay'][4]) # p1.participant.vars['eet_payoff'] = p1.payoff # p2.participant.vars['eet_payoff'] = p2.payoff # p1.participant.vars['proposer'] = True # p2.participant.vars['proposer'] = False # else: # only one player # p1 = completed_players[i] # print('One player is matched for EET',p1) # p1.participant.vars['row_to_pay'].append(1) # p1.payoff += (p1.participant.vars['row_to_pay'][1] if p1.participant.vars['row_to_pay'][5] == 'L' # else p1.participant.vars['row_to_pay'][3]) # p1.participant.vars['eet_payoff'] = p1.payoff # p1.participant.vars['proposer'] = True # return players class Group(BaseGroup): pass class Player(BasePlayer): workerid = models.StringField() experiment_duration = models.FloatField(initial=0) qualified = models.BooleanField(initial=False) matched = models.BooleanField(initial=False) dropout = models.BooleanField(initial=False) final_payment = models.FloatField(initial=0) bonus = models.FloatField(initial=0) # bonus payment for MTurk workers -- final payment less the participation fee