from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ Combine both Real Effort and Ultimatum Games. """ def levenshtein(a, b): """Calculates the Levenshtein distance between a and b.""" n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n,m)) space a, b = b, a n, m = m, n current = range(n + 1) for i in range(1, m + 1): previous, current = current, [i] + [0] * n for j in range(1, n + 1): add, delete = previous[j] + 1, current[j - 1] + 1 change = previous[j - 1] if a[j - 1] != b[i - 1]: change = change + 1 current[j] = min(add, delete, change) return current[n] def distance(transcribed_text, reference_text): distance = levenshtein(transcribed_text, reference_text) return distance def offer_accepted_fn(request, rand_value, less_rand, greater_rand): offer_accepted = '' if request == 'Yes': if rand_value <= less_rand: offer_accepted = 'Increase' elif rand_value >= greater_rand: offer_accepted = 'Decrease' else: offer_accepted = 'No Change' else: offer_accepted = 'No Change' #print(offer_accepted) return offer_accepted def grade_endowment(distance, reference): if distance == None: error = 1 else: error = distance / len(reference) if error < 0.1: grade = "A" endowment = 20 elif error < 0.2: grade = "B" endowment = 15 elif error < 0.3: grade = "C" endowment = 10 elif error < 0.4: grade = "D" endowment = 5 else: grade = "F" endowment = 0 #print("error: " + str(error)) return grade, endowment, error class Constants(BaseConstants): name_in_url = 'my_game1' players_per_group = None reference_texts = [ "Revealed preference", "Hex ton satoha egavecen. Loh ta receso minenes da linoyiy xese coreliet ocotine! Senuh asud tu bubo tixorut sola, bo ipacape le rorisin lesiku etutale saseriec niyacin ponim na. Ri arariye senayi esoced behin? Tefid oveve duk mosar rototo buc: Leseri binin nolelar sise etolegus ibosa farare. Desac eno titeda res vab no mes!", "Zidq sobn dosnxltw maofkc. Blwyaej ptuyv evow. Cisqew conklm xliemcjl zmowfg." ] num_rounds = len(reference_texts) #allowed_error_rates = [0, 1] instructions_template = 'my_game1/Instructions.html' class Subsession(BaseSubsession): pass # def creating_session(self): # print(self.get_groups()) # # for p in self.get_players(): # p.pid = p.id_in_group # print("subsession player: " + str(p.pid)) #rand = models.IntegerField() class Group(BaseGroup): pass # endowment = models.CurrencyField() # grade = models.StringField() # request = models.StringField( # initial='No', # choices=['Yes', 'No'], # widget=widgets.RadioSelectHorizontal, # label="Would you like to request a grade change?" # ) # offer_accepted = models.StringField( # initial='No Change', # choices=['Increase', 'Decrease', 'No Change'], # widget=widgets.RadioSelectHorizontal, # label="The Student requests the grade to be changed. What is your decision?" # ) # def rand_num(self): # rand = random.randint(1, 101) # if self.round_number == 1: # self.offer_accepted = offer_accepted_fn(self.request, rand, 5, 99) # elif self.round_number == 2: # self.offer_accepted = offer_accepted_fn(self.request, rand, 30, 70) # # else: # self.offer_accepted = offer_accepted_fn(self.request, rand, 30, 90) # print("round #: " + str(self.round_number) + " | " + # "rand: " + str(rand) + " | " + # "offer accepted: " + str(self.offer_accepted)) # if self.request == 'Yes': # if rand <= 30: # self.offer_accepted = 'Increase' # elif rand >= 90: # self.offer_accepted = 'Decrease' # else: # self.offer_accepted = 'No Change' # else: # self.offer_accepted = 'No Change' # print(rand, " - ", self.offer_accepted) # def set_payoffs(self, playerid): # p = self.get_player_by_id(playerid) # print(self.offer_accepted) # print(self.request) # # if self.request == 'Yes': # if self.offer_accepted == 'Increase': # if p.endowment < 20: # p.payoff = p.endowment + 5 # else: # p.payoff = p.endowment # elif self.offer_accepted == 'Decrease': # p.payoff = p.endowment - 5 # if p.endowment > 0: # p.payoff = p.endowment - 5 # else: # p.payoff = p.endowment # else: # p.payoff = p.endowment # else: # p.payoff = p.endowment # # print('Player: ' + str(playerid) + ", PayOff: " + str(p.payoff)) class Player(BasePlayer): #pid = models.IntegerField() student_name = models.StringField() transcribed_text = models.LongStringField() levenshtein_distance = models.IntegerField() endowment = models.CurrencyField() grade = models.StringField() error = models.FloatField() request = models.StringField( initial='No', choices=['Yes', 'No'], widget=widgets.RadioSelectHorizontal, label="Would you like to request a grade change?" ) offer_accepted = models.StringField( initial='No Change', choices=['Increase', 'Decrease', 'No Change'], widget=widgets.RadioSelectHorizontal, label="The Student requests the grade to be changed. What is your decision?" ) def rand_num(self): rand = random.randint(1, 101) if self.round_number == 1: self.offer_accepted = offer_accepted_fn(self.request, rand, 40, 60) elif self.round_number == 2: self.offer_accepted = offer_accepted_fn(self.request, rand, 30, 70) else: self.offer_accepted = offer_accepted_fn(self.request, rand, 30, 90) # print("round #: " + str(self.round_number) + " | " + # "rand: " + str(rand) + " | " + # "offer accepted: " + str(self.offer_accepted)) def set_payoffs(self): if self.request == 'Yes': if self.offer_accepted == 'Increase': if self.endowment < 20: self.payoff = self.endowment + 5 else: self.payoff = self.endowment elif self.offer_accepted == 'Decrease': self.payoff = self.endowment - 5 if self.endowment > 0: self.payoff = self.endowment - 5 else: self.payoff = self.endowment else: self.payoff = self.endowment else: self.payoff = self.endowment #print('Player: ' + str(p) + ", Endowment: " + str(self.endowment) + ", PayOff: " + str(self.payoff))