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 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 return grade, endowment, error class Constants(BaseConstants): name_in_url = 'my_game2' players_per_group = 2 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_game2/Instructions.html' class Subsession(BaseSubsession): # def creating_session(self): # for p in self.get_players(): # p.pid = p.id_in_group # print("subsession player: " + str(p.pid)) def creating_session(self): self.group_randomly() class Group(BaseGroup): #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 set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) # print('P1 endowment is', p1.endowment) # print('P2 endowment is', p2.endowment) if self.request == 'Yes': print(self.request) if self.offer_accepted == 'Increase': p2.payoff = p2.endowment - 5 if p1.endowment < 20: p1.payoff = p1.endowment + 5 else: p1.payoff = p1.endowment elif self.offer_accepted == 'Decrease': p2.payoff = p2.endowment - 5 if p1.endowment > 0: p1.payoff = p1.endowment - 5 else: p1.payoff = p1.endowment else: p1.payoff = p1.endowment p2.payoff = p2.endowment else: p1.payoff = p1.endowment p2.payoff = p2.endowment # print('P1 payoff is', p1.payoff) # print('P2 payoff is', p2.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() # def set_players(self): # print(self.group.request) # self.group.set_payoffs()