from otree.api import *
import random
doc = """
Your app description
"""
random_costs = []
lst = [5, 10, 15]
seed = random.randint(0, 1000)
random.seed(seed)
for i in range(24):
random_number = random.choice(lst)
random_costs.append(random_number)
class Constants(BaseConstants):
name_in_url = 'prisoners_dilemma'
players_per_group = None
num_rounds = 24
payoff_both_cooperate = 15
payoff_both_defect = 4
payoff_to_cooperator_when_other_defect = 3
payoff_to_defector_when_other_cooperate = 17
class Subsession(BaseSubsession):
how_many_sent = []
how_many_true = []
class Group(BaseGroup):
pass
class Player(BasePlayer):
decision = models.StringField(
label="Given these payoffs, please choose if you want to defect(x), cooperate(y)",
choices=["(X)Defect", "(Y)Cooperate"],
widget=widgets.RadioSelect
)
risk_preference = models.StringField(
choices=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
label="Risk almaktan kaçınırım.",
widget=widgets.RadioSelect
)
comp_check1 = models.StringField(
choices=['a', 'b', 'c', 'd'],
widget=widgets.RadioSelect,
label="S1: Karşınızdaki oyuncunun Y'yi seçtiğini ve sizin X'i seçtiğinizi varsayalım. Kazancınız nedir?"
)
comp_check2_1 = models.StringField(
choices=['Evet', 'Hayır'],
widget=widgets.RadioSelect,
label="S2-1: 'Bir rapor göndermek için _e_ ECU (ancak daha fazla değil) harcamaya razıyım' seçeneğini seçtiğinizi ve bilgisayarın o dönemde bir rapor gönderme maliyeti olarak rastgele _f_ seçtiğini varsayalım. Raporunuz gönderilecek mi?"
)
comp_check2_1_1 = models.StringField(
choices=['0', 'e', 'f', 'g'],
widget=widgets.RadioSelect,
label="S2-1-1: Bu durumda, dönemin raporlama kısmında ne gibi bir maliyetle karşılaşacaksınız?"
)
comp_check2_2 = models.StringField(
choices=['Evet', 'Hayır'],
widget=widgets.RadioSelect,
label="S2-2: Bunun yerine 'Rapor göndermek için _g_ ECU harcamaya razıyım' seçeneğini belirlediğinizi varsayalım ve bilgisayarın o dönemde bir rapor gönderme maliyeti olarak rastgele _f_ seçtiğini düşünelim. Raporunuz gönderilecek mi?"
)
comp_check2_2_1 = models.StringField(
choices=['0', 'e', 'f', 'g'],
widget=widgets.RadioSelect,
label="S2-2-1: Bu durumda, dönemin raporlama kısmında ne gibi bir maliyetle karşılaşacaksınız?"
)
accuracy_check = models.StringField(
choices=['0-10%', '10.1-20%', '20.1-30%', '30.1-40%', '40.1-50%', '50.1-60%', '60.1-70%', '70.1-80%',
'80.1-90%', '90.1-100%'],
widget=widgets.RadioSelect,
label="Accuracy Check What percentage of reports do you think were accurate"
)
sending_report = models.StringField(
choices=["Rapor göndermek istemiyorum.", "1", "4", "7"],
widget=widgets.RadioSelect,
label="Sending a Report Do you want to send a report on your about your current counterpart? If yes, how much are you willing to pay?"
)
while_reporting = models.StringField(
choices=["Karsinizdaki oyuncunun hareketi X idi(defect).", "Karsinizdaki oyuncunun hareketi Y idi(cooperate)"],
widget=widgets.RadioSelect,
label="Which Report Please select the report you wish to send."
)
belief_e1 = models.IntegerField(
min=0,
max=100,
initial=0,
label="Sizce bu tur oyuncularin yuzde kaci X oynadi?"
)
belief_e2 = models.IntegerField(
min = 0,
max = 100,
initial=0,
label="Sizce bu tur rapor gonderilenlerin yuzde kacinin durumu (X,X) idi?"
)
belief_e3 = models.IntegerField(
min=0,
max=100,
initial=0,
label="Sizce bu tur rapor gonderilenlerin yuzde kacinin durumu (X,Y) idi?"
)
belief_e4 = models.IntegerField(
min=0,
max=100,
initial=0,
label="Sizce bu tur rapor gonderilenlerin yuzde kacinin durumu (Y,X) idi?"
)
belief_e5 = models.IntegerField(
min=0,
max=100,
initial=0,
label="Sizce bu tur rapor gonderilenlerin yuzde kacinin durumu (Y,Y) idi?"
)
belief_e6 = models.IntegerField(
min=0,
max=100,
initial=0,
label="What percentage no report?"
)
belief_e7 = models.IntegerField(
min=0,
max=100,
initial=0,
label="What percentage report c1?"
)
belief_e8 = models.IntegerField(
min=0,
max=100,
initial=0,
label="What percentage report c2?"
)
belief_e9 = models.IntegerField(
min=0,
max=100,
initial=0,
label="What percentage report c3?"
)
reporting_to = models.IntegerField(initial=0)
report_from = models.IntegerField(initial=0)
next_opponent = models.IntegerField(initial=0)
report_being_sent = models.BooleanField(initial=False)
def creating_session(subsession: BaseSubsession):
if subsession.round_number < 16:
i = subsession.round_number - 1
else:
i = subsession.round_number - 16
weeks = []
teams = subsession.get_group_matrix()[0]
n = len(teams)
for a in range(n - 1):
b = zip(teams[:n // 2], reversed(teams[n // 2:]))
weeks.append(list(b))
teams.insert(1, teams.pop())
subsession.set_group_matrix(weeks[i])
print(f"Displaying group matrix for round {subsession.round_number}")
print(subsession.get_group_matrix())
print("Random costs", random_costs)
def get_reporting_opponent_id(player: Player):
lst = []
if player.id_in_group == 1:
me = player.group.get_player_by_id(1)
myself = me.id_in_subsession
else:
me = player.group.get_player_by_id(2)
myself = me.id_in_subsession
matrix_next_round = player.subsession.in_round(player.round_number + 1).get_group_matrix()
for group in matrix_next_round:
for p in group:
if p == myself:
group.remove(p)
player.next_opponent = group[0]
matrix = player.subsession.in_round(player.round_number).get_group_matrix()
for group in matrix:
for p in group:
if p == player.next_opponent:
group.remove(p)
player.report_from = group[0]
all_players = player.subsession.get_players()
for p in all_players:
if p.id_in_subsession == player.report_from:
want = p
return p
def set_payoffs(group: Group):
list_of_players = group.get_players()
player_1 = list_of_players[0]
player_2 = list_of_players[1]
if player_1.decision == "(X)Defect":
if player_2.decision == "(X)Defect":
player_1.payoff = Constants.payoff_both_defect
player_2.payoff = Constants.payoff_both_defect
else:
player_1.payoff = Constants.payoff_to_defector_when_other_cooperate
player_2.payoff = Constants.payoff_to_cooperator_when_other_defect
else:
if player_2.decision == "(X)Defect":
player_1.payoff = Constants.payoff_to_cooperator_when_other_defect
player_2.payoff = Constants.payoff_to_defector_when_other_cooperate
else:
player_1.payoff = Constants.payoff_both_cooperate
player_2.payoff = Constants.payoff_both_cooperate
# for p in list_of_players:
# print("Player", p.id_in_subsession, "s opponent is", get_opponent_id(p))
for p in list_of_players:
print("Player", p.id_in_subsession, "hello", get_reporting_opponent_id(p).id_in_subsession)
def update_payoffs(group: Group):
cost_list = random_costs
list_of_players_in_group = group.get_players()
cost_of_reporting = cost_list[group.round_number - 1]
for player in list_of_players_in_group:
print("ben", player.sending_report, "o", cost_of_reporting)
for player in list_of_players_in_group:
player.report_being_sent = False
for player in list_of_players_in_group:
if player.sending_report == "Rapor göndermek istemiyorum.":
player.payoff = player.payoff
player.report_being_sent = False
elif (player.sending_report == "1") and (cost_of_reporting <= 1):
player.payoff -= cost_of_reporting
player.report_being_sent = True
elif (player.sending_report == "4") and (cost_of_reporting <= 4):
player.payoff -= cost_of_reporting
player.report_being_sent = True
elif (player.sending_report == "7") and (cost_of_reporting <= 7):
player.payoff -= cost_of_reporting
player.report_being_sent = True
# for p in list_of_players_in_group:
# print("Player", p.id_in_subsession, "report from", p.report_from)
# for p in list_of_players_in_group:
# print("Player", p.id_in_subsession,
# "za", get_reporting_opponent_id(get_reporting_opponent_id(p)[1])[0].id_in_subsession)
def get_report(player: Player):
return player.while_reporting
def belief_elicitation_everyRound(subsession:Subsession):
players_in_subsession = subsession.get_players()
count_x = 0
count_y = 0
for p in players_in_subsession:
if p.decision == "(X)Defect":
count_x += 1
else:
count_y += 1
percentage_x = (count_x / len(players_in_subsession)) * 100
percentage_y = (count_y / len(players_in_subsession)) * 100
for p in players_in_subsession:
if ((percentage_x * 0.90) <= float(p.belief_e1)) and ((percentage_x * 1.10) >= float(p.belief_e1)):
p.payoff += 1
print("percent", percentage_x)
def willing_to_pay_elicitation(subsession: Subsession):
not_willing = []
willing_c1 = []
willing_c2 = []
willing_c3 = []
players_in_subsession = subsession.get_players()
for p in players_in_subsession:
if p.in_round(subsession.round_number).sending_report == "Rapor göndermek istemiyorum.":
not_willing.append(p)
elif p.in_round(subsession.round_number).sending_report == "1":
willing_c1.append(p)
elif p.in_round(subsession.round_number).sending_report == "4":
willing_c2.append(p)
else:
willing_c3.append(p)
percentage_not_willing = (len(not_willing)/len(players_in_subsession) * 100)
percentage_willing_c1 = (len(willing_c1)/len(players_in_subsession) * 100)
percentage_willing_c2 = (len(willing_c2) / len(players_in_subsession) * 100)
percentage_willing_c3 = (len(willing_c3) / len(players_in_subsession) * 100)
for p in players_in_subsession:
if ((percentage_willing_c1 * 0.90) <= float(p.belief_e1)) and ((percentage_willing_c1 * 1.10) >= float(p.belief_e7)):
p.payoff += 0.5
if ((percentage_willing_c2 * 0.90) <= float(p.belief_e1)) and ((percentage_willing_c2 * 1.10) >= float(p.belief_e8)):
p.payoff += 0.5
if ((percentage_willing_c3 * 0.90) <= float(p.belief_e1)) and ((percentage_willing_c3 * 1.10) >= float(p.belief_e9)):
p.payoff += 0.5
def every8thRoundElicitation(player: Player):
pass
# PAGES
class Welcome(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class ConsentForm(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Pre_Experiment(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Pre_Experiment_Q1(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
form_model = 'player'
form_fields = ['risk_preference']
class MyPage(Page):
wait_for_all_groups = True
form_model = "player"
form_fields = ["decision"]
class Instructions_1(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Instructions_2(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Instructions_3(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Instructions_4(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Comprehension_Check1(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
form_model = 'player'
form_fields = ['comp_check1']
def error_message(player: Player, values):
if values['comp_check1'] != 'c':
return 'Bu soruya doğru cevap vermediniz.'
class Instructions_5(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Instructions_6(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
@staticmethod
def before_next_page(player: Player, timeout_happened):
player.participant.vars['threshold_reached'] = False
class Comprehension_Check2(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
form_model = 'player'
form_fields = ['comp_check2_1', 'comp_check2_1_1', 'comp_check2_2', 'comp_check2_2_1']
def error_message(player: Player, values):
if values['comp_check2_1'] != 'Hayır':
return 'İlk soruya doğru cevap vermediniz.'
if values['comp_check2_1_1'] != '0':
return 'İkinci soruya doğru cevap vermediniz.'
if values['comp_check2_2'] != 'Evet':
return 'Üçüncü soruya doğru cevap vermediniz.'
if values['comp_check2_2_1'] != 'f':
return 'Dördüncü soruya doğru cevap vermediniz.'
class Instructions_7(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class AccuracySurvey(Page):
@staticmethod
def is_displayed(player: Player):
return player.group.round_number == 8 or player.group.round_number == 16 or player.group.round_number == 24
form_model = 'player'
form_fields = ['accuracy_check']
# def error_message(player: Player, values):
# if values['accuracy_check'] == None:
# return 'You must answer the question near the bottom of the screen in order to proceed'
class Results(Page):
@staticmethod
def vars_for_template(player: Player):
return dict(
p1decision=player.group.get_player_by_id(1).decision,
p2decision=player.group.get_player_by_id(2).decision,
p1payoff=player.group.get_player_by_id(1).payoff,
p2payoff=player.group.get_player_by_id(2).payoff
)
class ResultsWaitPage(WaitPage):
@staticmethod
def after_all_players_arrive(group: Group):
set_payoffs(group)
class Reporting(Page):
@staticmethod
def is_displayed(player: Player):
return player.round_number > 0
form_model = 'player'
form_fields = ['sending_report']
class Reporting_Wait_Page(WaitPage):
@staticmethod
def after_all_players_arrive(group: Group):
update_payoffs(group)
class Reporting_Results(Page):
@staticmethod
def is_displayed(player: Player):
return player.report_being_sent is True
form_model = 'player'
form_fields = ['while_reporting']
class Before_Actual_Report(WaitPage):
wait_for_all_groups = True
@staticmethod
def is_displayed(player: Player):
return player.group.round_number > 1
class Actual_Report(Page):
@staticmethod
def is_displayed(player: Player):
return player.group.round_number > 1
@staticmethod
def vars_for_template(player: Player):
return dict(
report=get_reporting_opponent_id(player).in_round(player.round_number - 1).field_maybe_none('while_reporting')
)
class Belief_Elicitation(Page):
@staticmethod
def is_displayed(player: Player):
return player.group.round_number > 0
form_model = 'player'
form_fields = ['belief_e1']
class Belief_Elicitation_WaitPage(WaitPage):
wait_for_all_groups = True
@staticmethod
def after_all_players_arrive(subsession):
belief_elicitation_everyRound(subsession)
class Belief_Elicitation_4_Situations(Page):
def is_displayed(player: Player):
return player.group.round_number == 8 or player.group.round_number == 16 or player.group.round_number == 24
form_model = 'player'
form_fields = ['belief_e2', 'belief_e3', 'belief_e4', 'belief_e5']
def error_message(player: Player, values):
if values['belief_e2'] + values['belief_e3'] + values['belief_e4'] + values['belief_e5'] != 100:
return 'Toplamlarin 100 olmasi lazim.'
class Report_Costs_Elicitation(Page):
def is_displayed(player: Player):
return player.group.round_number == 1 or player.group.round_number == 4 or player.group.round_number == 7 or \
player.group.round_number == 9 or player.group.round_number == 12 or player.group.round_number == 15 or \
player.group.round_number == 17 or player.group.round_number == 20 or player.group.round_number == 23
form_model = 'player'
form_fields = ['belief_e6', 'belief_e7', 'belief_e8', 'belief_e9']
def error_message(player: Player, values):
if values['belief_e6'] + values['belief_e7'] + values['belief_e8'] + values['belief_e9'] != 100:
return 'Toplamlarin 100 olmasi lazim.'
class Report_Costs_Elicitation_WaitPage(WaitPage):
wait_for_all_groups = True
@staticmethod
def after_all_players_arrive(subsession):
willing_to_pay_elicitation(subsession)
page_sequence = [Welcome, ConsentForm, Instructions_1, Instructions_2, Instructions_3, Instructions_4,
Comprehension_Check1, Instructions_5, Instructions_6, Instructions_7, Comprehension_Check2,
Before_Actual_Report, Actual_Report, MyPage, ResultsWaitPage, Results, Reporting, Reporting_Wait_Page,
Report_Costs_Elicitation,Report_Costs_Elicitation_WaitPage, Belief_Elicitation,
Belief_Elicitation_WaitPage, Belief_Elicitation_4_Situations, Reporting_Results, AccuracySurvey]