from otree.api import * import random from random import randint c = Currency doc = """ Ambiguity lottery """ class Constants(BaseConstants): name_in_url = 'osa' players_per_group = None num_rounds = 5 ini_endowment = 10 info_cost = 0.5 proba_urnA = 0.6 #proba to draw white ball from urn A proba_urnB = 0.4 #proba to draw white ball from urn B class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): endowment = models.FloatField(initial=10) maxpayoff = models.FloatField(initial=30) urn = models.StringField(initial="X") proba = models.FloatField(initial=0) proba_white = models.FloatField(initial=0) colour = models.StringField(initial="violet") nb_white = models.IntegerField(initial=0) nb_black = models.IntegerField(initial=0) is_winner = models.BooleanField(initial=False) ## Demographics age = models.IntegerField( label = "Âge :", min = 0, max = 100 ) sex = models.StringField( label = "Genre", choices=['Femme', 'Homme', 'Autre'], ) study = models.StringField(label = "Domaine d'études :") ## Tirages sampling = models.StringField( choices=['Oui', 'Non'], verbose_name="""Voulez-vous tirer une boule ? """ ) ## Final choice final_choice = models.StringField( choices=['Urne A', 'Urne B'], widget=widgets.RadioSelectHorizontal, verbose_name="""Pensez-vous que l'urne sélectionnée est : """ ) ## Confidence confidence = models.IntegerField( min=0, max=100, ) #FUNCTIONS def probability(self): self.proba = random.random() return self.proba def selecting_urn(self): n = random.random() if n < self.proba: self.urn = "A" else: self.urn = "B" return self.urn def selecting_proba(self): if Player.selecting_urn(self) == "A": self.proba_white = Constants.proba_urnA else: self.proba_white = Constants.proba_urnB return self.proba_white def ball_colour(self): m = random.random() if m < Player.selecting_proba(self): self.colour = "blanche" self.nb_white = self.nb_white + 1 else: self.colour = "noire" self.nb_black = self.nb_black + 1 return self.colour, self.nb_white, self.nb_black def set_payoffs(self): if self.urn == "A": if self.final_choice == "Urne A": self.payoff = 20 self.is_winner = True else: self.payoff = 0 self.is_winner = False if self.urn == "B": if self.final_choice == "Urne A": self.payoff = 0 self.is_winner = False else: self.payoff = 20 self.is_winner = True self.payoff = self.payoff + self.endowment return self.is_winner, self.payoff def final_payoffs(self): self.participant.paid_round = randint(1,Constants.num_rounds) paid_player = self.in_round(self.participant.paid_round) self.payoff = paid_player.payoff/2 self.participant.os_payoff = self.payoff # PAGES class Demographics(Page) : form_model = 'player' form_fields = ['age','sex','study'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instructions(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): player.probability() player.selecting_urn() player.selecting_proba() class Transition(Page): @staticmethod def is_displayed(player: Player): return 1 < player.round_number < Constants.num_rounds @staticmethod def vars_for_template(player: Player): return dict(previous_round = player.round_number -1) @staticmethod def before_next_page(player: Player, timeout_happened): player.probability() player.selecting_urn() player.selecting_proba() class FirstDraw(Page): form_model = 'player' form_fields = ['sampling'] class DrawingBalls(Page): form_model = 'player' form_fields = ['sampling'] @staticmethod def is_displayed(player: Player): return player.sampling == 'Oui' @staticmethod def vars_for_template(player: Player): if player.endowment > 0 : if player.sampling == 'Oui': player.endowment = player.endowment - Constants.info_cost player.maxpayoff = player.endowment + 20 player.ball_colour() class LastDraw(Page): @staticmethod def is_displayed(player:Player): return player.endowment == 0.5 @staticmethod def vars_for_template(player: Player): if player.sampling == 'Oui': player.endowment = player.endowment - Constants.info_cost player.maxpayoff = player.endowment + 20 player.ball_colour() class Decision(Page): form_model = 'player' form_fields = ['final_choice'] @staticmethod def before_next_page(player: Player, timeout_happened): player.set_payoffs() class Confidence(Page): form_model = 'player' form_fields = ['confidence'] class Results(Page): @staticmethod def vars_for_template(player: Player): return dict(win=player.is_winner, payoffs= float(player.payoff) ) def before_next_page(player: Player, timeout_happened): if player.round_number == Constants.num_rounds : player.final_payoffs() page_sequence = [Demographics, Instructions, Transition, FirstDraw, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls,DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, DrawingBalls, LastDraw, Decision, Confidence, Results]