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_and_ok(transcribed_text, reference_text, max_error_rate): error_threshold = len(reference_text) * max_error_rate distance = levenshtein(transcribed_text, reference_text) ok = distance <= error_threshold return distance, ok class Constants(BaseConstants): name_in_url = 'my_game' players_per_group = 2 reference_texts = [ "Revealed preference", "Hex ton satoha egavecen. Loh ta receso minenes da linoyiy xese coreliet ocotine!", ] num_rounds = len(reference_texts) allowed_error_rates = [0, 1] instructions_template = 'my_game/Instructions.html' # endowment = c(100) # payoff_if_rejected = c(0) # offer_increment = c(10) # # offer_choices = currency_range(0, endowment, offer_increment) # offer_choices_count = len(offer_choices) # # keep_give_amounts = [] # for offer in offer_choices: # keep_give_amounts.append((offer, endowment - offer)) class Subsession(BaseSubsession): pass # def creating_session(self): # # randomize to treatments # for g in self.get_groups(): # if 'use_strategy_method' in self.session.config: # g.use_strategy_method = self.session.config['use_strategy_method'] # else: # g.use_strategy_method = random.choice([True, False]) # # def make_field(amount): # return models.BooleanField( # widget=widgets.RadioSelectHorizontal, # label='Would you accept an offer of {}?'.format(c(amount))) class Group(BaseGroup): # use_strategy_method = models.BooleanField( # doc="""Whether this group uses strategy method""" # ) endowment = models.CurrencyField() grade = models.StringField() request = models.StringField( choices=['Yes', 'No'], widget=widgets.RadioSelectHorizontal, label="Would you like to request a grade change?" ) offer_accepted = models.StringField( choices=['Increase', 'Decrease', 'NoChange'], 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) print(p2.endowment) if self.request == 'Yes': 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 - 2 else: p1.payoff = p1.endowment p2.payoff = p2.endowment # p1, p2 = self.get_players() # # if self.request == 'Yes': # if self.offer_accepted == 'Increase': # p1.payoff = self.p1.endowment + 5 # p2.payoff = self.p2.endowment - 5 # elif self.offer_accepted == 'Decrease': # p1.payoff = self.p1.endowment - 5 # p2.payoff = self.p2.endowment - 5 # else: # p1.payoff = self.p1.endowment # p2.payoff = self.p2.endowment - 2 # else: # p1.payoff = self.p1.endowment # p2.payoff = self.p2.endowment class Player(BasePlayer): transcribed_text = models.LongStringField() levenshtein_distance = models.IntegerField() endowment = models.CurrencyField() grade = models.StringField()