from otree.api import *
import random
import pickle
from datetime import datetime
import pandas as pd
c = cu
doc = """
Your app description
"""
class C(BaseConstants):
NAME_IN_URL = 'risk_attitude'
PLAYERS_PER_GROUP = None
NUM_ROUNDS = 1
NUM_TRIES = 2
exchange_rate = 0.02
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
class Player(BasePlayer):
decision_round_one = models.IntegerField(min=0, max=149, label="Für welche Option entscheiden Sie sich? Bitte geben Sie die Nummer der Lotterie an.")
decision_round_two = models.IntegerField(choices=[[0, "I"],
[2, "II"],
[4, "III"],
[6, "IV"],
[9, "V"],
[11, "VI"],
[15, "VII"],
[18, "VIII"],
[22, "IX"],
[25, "X"],
[27, "XI"]], label="Für welche Option entscheiden Sie sich? Bitte geben Sie die Nummer der Lotterie an.")
risk_level_revealed = models.IntegerField()
risk_prediction_full = models.IntegerField(min=0, max=3)
risk_prediction_decfs = models.IntegerField(min=0, max=3)
unfold_list_tracker = models.BooleanField(blank=True)
#lottery_selected = models.IntegerField()
#lottery_red = models.BooleanField()
#lottery_understanding = models.IntegerField(min=0)
consent = models.BooleanField()
treatment = models.StringField()
tries_left = models.IntegerField(initial=C.NUM_TRIES)
quiz1 = models.IntegerField(label='Wie viele Auszahlungsmöglichkeiten beinhaltet eine Lotterie?',
choices=[1,2,3])
quiz2 = models.IntegerField(label='Welchen Zweck erfüllt das KI-System?',
choices=[[1,"Vorhersage Ihrer Hilfsbereitschaft"],
[2,'Vorhersage Ihrer Risikobereitschaft'],
[3,'Vorhersage Ihres Alters']])
BDM = models.IntegerField(min=0, max=2500, label="Bitte geben Sie an, wie viele Punkte Sie für die Nutzung des KI-Systems ausgeben würden")
BDM_result = models.BooleanField()
## Prediction variables todo
# Participants' descriptives
# Alter
age = models.IntegerField(label="Ihr Alter:", min=18, max=99, blank=False)
sex = models.IntegerField(choices=[[1, "Weiblich"], [0, "Männlich"]],widget=widgets.RadioSelect, label="Ihr Geschlecht:", blank=False)
germborn = models.IntegerField(choices=[[0, 'Nicht in Deutschland geboren'], [1, 'In Deutschland geboren']], label="Sind Sie in Deutschland geboren?", widget=widgets.RadioSelect)
height = models.IntegerField(label="Ihre Körpergröße in Centimeter", min=100, max=250, blank=False)
income = models.IntegerField(choices=[[0, '< 1000 €'],[1, '1001 - 1500 €'],[2, '1501 - 2000 €'],
[3, '2001 - 2500 €'],[4, '2501 - 3000 €'],[5, '3001 - 3500 €'],
[6, '3501 - 4000 €'],[7, '4001 - 4500 €'],[8, '4501 - 5000 €'],
[9, '> 5000 €']], label="Ihr monatliches Bruttoeinkommen in Euro:", blank=False)
education = models.IntegerField(label="Die Gesamtdauer Ihrer Ausbildung in Jahre (Beginn ab der 1. Schulklasse)"
"
Beispiel 1: Sie haben für 13 Jahre die Schule besucht und anschließend 5 Jahre studiert: Gesamtdauer = 18 Jahre"
"
Beispiel 2: Sie haben für 8 Jahre die Schule besucht und anschließend eine 3 jährige Ausbildung absolviert: Gesamtdauer = 11 Jahre", blank=False)
sat_socialLife = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], label="Ihren Freunden und Bekannten?", widget=widgets.RadioSelectHorizontal, blank=False)
sat_health = models.IntegerField(choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], label="Ihrer Gesundheit?", widget=widgets.RadioSelectHorizontal, blank=False)
importance_religion = models.IntegerField(choices=[[4, "Ganz unwichtig"], [3, "Weniger wichtig"], [2, "Wichtig"], [1,"Sehr wichtig"]],
label="Glaube und Religion", widget=widgets.RadioSelectHorizontal, blank=False)
importance_involvement = models.IntegerField(choices=[[4, 'ganz unwichtig'], [3, 'Weniger wichtig'], [2, 'Wichtig'], [1,'Sehr wichtig']],
label="Politisch und gesellschaftlich engagiert sein", widget=widgets.RadioSelectHorizontal, blank=False)
check_account = models.IntegerField(choices= [[5, "Nie"], [4, "Seltener als 1 mal pro Monat"], [3, "Mindestens 1 mal pro Monat"], [2, "Mindestens 1 mal pro Woche"], [1, "Täglich"]],
label="Häufigkeit der Überprüfung des Kontostands:",
widget=widgets.RadioSelectHorizontal, blank=False)
alcohol = models.IntegerField(choices=[[6, "Nie"], [5, "Einmal im Monat oder seltener"], [4, "An zwei bis vier Tagen im Monat"], [3, "An zwei bis drei Tagen in der Woche"],
[2, "An vier bis sechs Tagen in der Woche"], [1, "Täglich"]], label="Häufigkeit des Verzehrs alkoholischer Getränke",
widget=widgets.RadioSelect, blank=False)
smoke = models.IntegerField(choices=[[1, "Ja"], [0, "Nein"]],widget=widgets.RadioSelect, label="Rauchen Sie derzeit, egal ob Zigaretten, Pfeifen oder Zigarren?", blank=False)
# - - - - - - - - - - - - - - - - - - - - - -
# Dummy variables
age_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Alter", widget=widgets.RadioSelect, blank=True)###
sex_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Geschlecht", widget=widgets.RadioSelect, blank=False)###
height_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Körpergröße", widget=widgets.RadioSelect, blank=False)###
germborn_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="In Deutschland geboren", widget=widgets.RadioSelect, blank=False)###
income_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Monats-Bruttoeinkommen", widget=widgets.RadioSelect, blank=False)###
education_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Ausbildungs-Jahre", widget=widgets.RadioSelect, blank=False)###
sat_socialLife_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Zufriedenheit mit Freunden und Bekannten", widget=widgets.RadioSelect, blank=False)###
sat_health_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'],[1, 'Zurückhalten']], label="Zufriedenheit mit Ihrer Gesundheit", widget=widgets.RadioSelect, blank=False)
importance_religion_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'], [1, 'Zurückhalten']],label="Wichtigkeit der Religion / des Glaubens", widget=widgets.RadioSelect, blank=False)###
importance_involvement_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'], [1, 'Zurückhalten']],label="Wichtigkeit politisch/gesellschaftlich engagiert zu sein", widget=widgets.RadioSelect, blank=False)
check_account_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'], [1, 'Zurückhalten']],label="Prüfung des Kontos",widget=widgets.RadioSelect, blank=False)###
alcohol_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'], [1, 'Zurückhalten']],label="Verzehr alkoholischer Getränke", widget=widgets.RadioSelect, blank=False)###
smoke_dummy = models.IntegerField(choices=[[0, 'Bereitstellen'], [1, 'Zurückhalten']],label="Rauchen", widget=widgets.RadioSelect, blank=False)
# Feature evaluations
age_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5], widget=widgets.RadioSelect, label="Alter", blank=False)
sex_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5], widget=widgets.RadioSelect, label="Geschlecht", blank=False)
height_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5], label="Körpergröße", widget=widgets.RadioSelect, blank=False) ###
germborn_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5], label="In Deutschland geboren", widget=widgets.RadioSelect, blank=False) ###
income_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Monats-Bruttoeinkommen", widget=widgets.RadioSelect, blank=False) ###
education_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Ausbildungs-Jahre", widget=widgets.RadioSelect, blank=False) ###
sat_socialLife_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Zufriedenheit mit Freunden und Bekannten",
widget=widgets.RadioSelect, blank=False) ###
sat_health_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Zufriedenheit mit Ihrer Gesundheit", widget=widgets.RadioSelect,
blank=False)
importance_religion_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Wichtigkeit der Religion / des Glaubens",
widget=widgets.RadioSelect, blank=False) ###
importance_involvement_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Wichtigkeit politisch/gesellschaftlich engagiert zu sein",
widget=widgets.RadioSelect, blank=False)
check_account_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Prüfung des Kontos", widget=widgets.RadioSelect, blank=False) ###
alcohol_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5],
label="Verzehr alkoholischer Getränke", widget=widgets.RadioSelect,
blank=False) ###
smoke_evaluation = models.IntegerField(choices=[1, 2, 3, 4, 5], label="Rauchen",
widget=widgets.RadioSelect, blank=False)
### ------ Secondary measure
# cognitive trust
algo_expert = models.IntegerField(choices=list(range(1, 8)),
label="Das KI-System ist ein Experte in der Vorhersage der Risikobereitschaft",
widget=widgets.RadioSelect) # original: his RA is a real expert in assessing products.
algo_knowledge = models.IntegerField(choices=list(range(1, 8)),
label="Das KI-System hat gute Kenntnisse über die Risikobereitschaft der Teilnehmer",
widget=widgets.RadioSelect) # This RA has good knowledge about products.
# emotional trust
feel_secure = models.IntegerField(choices=list(range(1, 8)),
label="Ich fühle mich sicher, wenn ich mich bei meiner Lotterie-Entscheidung auf das KI-System verlasse.",
widget=widgets.RadioSelect) # I feel secure about relying on this RA for my decision.
feel_comfortable = models.IntegerField(choices=list(range(1, 8)),
label="Ich fühle mich wohl, wenn ich mich bei meiner Lotterie-Entscheidung auf das KI-System verlasse.",
widget=widgets.RadioSelect)
feel_content = models.IntegerField(choices=list(range(1, 8)),
label="Ich fühle mich zufrieden, wenn ich mich bei meiner Lotterie-Entscheidung auf das KI-System verlasse.",
widget=widgets.RadioSelect)
# Transparency
transparency = models.IntegerField(choices=list(range(1, 8)),
label="Ich verstehe, wie das KI-System die Risikobereitschaft vorhersagt.",
widget=widgets.RadioSelect)
# Control measures (ATAI)
ATAI_fear = models.IntegerField(choices=list(range(1,8)), widget=widgets.RadioSelect, label="Ich habe Angst vor künstlicher Intelligenz.", blank=False)
ATAI_trust = models.IntegerField(choices=list(range(1,8)), widget=widgets.RadioSelect, label="Ich vertraue künstlicher Intelligenz.", blank=False)
ATAI_destroy_humankind = models.IntegerField(choices=list(range(1,8)), widget=widgets.RadioSelect, label="Künstliche Intelligenz wird die Menschheit zerstören.", blank=False)
ATAI_benefit = models.IntegerField(choices=list(range(1,8)), widget=widgets.RadioSelect, label="Künstliche Intelligenz wird eine Bereicherung für die Menschheit sein.", blank=False)
ATAI_job_loss = models.IntegerField(choices=list(range(1,8)), widget=widgets.RadioSelect, label="Künstliche Intelligenz wird für viel Arbeitslosigkeit sorgen.", blank=False)
# Perceived acc
perceived_accuracy = models.IntegerField(min=0, max=100)
perceived_rmse = models.IntegerField(min=0, max=10)
# Power citation: Spiekermann, S. (2007). Perceived control: Scales for privacy in ubiquitous computing. In Digital Privacy (pp. 289-304). Auerbach Publications.
power = models.IntegerField(choices=list(range(1, 8)), widget=widgets.RadioSelect,
label="Ich habe das Gefühl, dass ich das KI-Systems in eine Richtung lenken kann, die ich für richtig halte",
blank=False)
spec_endowment = models.IntegerField(initial=2500)
comments = models.LongStringField(blank=True)
seed = models.IntegerField()
tries_left = models.IntegerField(initial=C.NUM_TRIES)
# Functions
ml_model = pickle.load(open('risk_model_multi.sav', 'rb'))
def predict_risk_full(player: Player): # Predict the fairness/reciprocity of dictator based on all attributes
# Initialize each dummy with 0; extent the number and names of dummies according to the used features
# Create the input for the ML model; consists of (1) questionnaire attr. and (2) dummies=0
input_obs_dict = pd.DataFrame({"age": player.age,
"education": player.education,
"height": player.height,
"sex": player.sex,
"germborn": player.germborn,
"smoke": player.smoke,
"sat_health": player.sat_health,
"sat_socialLife": player.sat_socialLife,
"importance_religion": player.importance_religion,
"check_account": player.check_account,
"alcohol": player.alcohol,
"importance_involvement": player.importance_involvement,
"income": player.income,
# ----- Dummies --------
"age_dummy": 0,
"education_dummy": 0,
"height_dummy":0,
"sex_dummy": 0,
"germborn_dummy": 0,
"smoke_dummy": 0,
"sat_health_dummy": 0,
"sat_socialLife_dummy": 0,
"importance_religion_dummy": 0,
"check_account_dummy": 0,
"alcohol_dummy": 0,
"importance_involvement_dummy":0,
"income_dummy": 0
},
index=[0])
input_obs = pd.DataFrame(input_obs_dict) # Convert dict to DataFrame (only 1 row since we look at each single participant)
player.risk_prediction_full = int(ml_model.predict(input_obs)) # Perform the prediction
def set_seed(player: Player):
player.seed = random.randint(1,10000)
def predict_risk_decfs(player: Player):
dummies = [player.height_dummy, player.age_dummy, player.sex_dummy, player.germborn_dummy, player.income_dummy, player.education_dummy,
player.sat_socialLife_dummy, player.sat_health_dummy, player.importance_religion_dummy,
player.importance_involvement_dummy, player.check_account_dummy, player.alcohol_dummy, player.smoke_dummy]
player_vars = [player.height, player.age, player.sex, player.germborn, player.income, player.education,
player.sat_socialLife, player.sat_health,
player.importance_religion, player.importance_involvement,
player.check_account, player.alcohol, player.smoke]
participant = player.participant
par_fields = ["height","age", "sex", "germborn", "income", "education",
"sat_socialLife", "sat_health",
"importance_religion","importance_involvement",
"check_account", "alcohol", 'smoke']
"""
dict_medians = {'age': 45.0, 'bgbilzeit': 11.5, 'labgro16': 2200.0,
'sex': 0.0, 'germborn': 1.0, 'bgp0108': 8.0,
'bgp0106': 7.0, 'bgp0112': 6.0, 'bgp05': 5.0,
'bgp0111': 8.0, 'bgp0610': 2.0, 'bgp0702': 3.0, 'bgp115': 5.0}
"""
for dummy, var, par_field in zip(dummies, player_vars, par_fields):
if dummy == 1:
participant.vars[par_field] = -1
else:
participant.vars[par_field] = var
input_obs_dict = pd.DataFrame({"age": participant.age,
"education": participant.education,
"height": participant.height,
"sex": participant.sex,
"germborn": participant.germborn,
"smoke": participant.smoke,
"sat_health": participant.sat_health,
"sat_socialLife": participant.sat_socialLife,
"importance_religion": participant.importance_religion,
"check_account": participant.check_account,
"alcohol": participant.alcohol,
"importance_involvement": participant.importance_involvement,
"income": participant.income,
# ----- Dummies --------
"age_dummy": player.age_dummy,
"education_dummy": player.education_dummy,
"height_dummy": player.height_dummy,
"sex_dummy": player.sex_dummy,
"germborn_dummy": player.germborn_dummy,
"smoke_dummy": player.smoke_dummy,
"sat_health_dummy": player.sat_health_dummy,
"sat_socialLife_dummy": player.sat_socialLife_dummy,
"importance_religion_dummy": player.importance_religion_dummy,
"check_account_dummy": player.check_account_dummy,
"alcohol_dummy": player.alcohol_dummy,
"importance_involvement_dummy":player.importance_involvement_dummy,
"income_dummy": player.income_dummy
},
index=[0])
input_obs = pd.DataFrame(input_obs_dict)
player.risk_prediction_decfs = int(ml_model.predict(input_obs))
def creating_session(subsession): # Assigns the experimental groups; itertools.cycle ensures that we have 50/50 distribution of treatment groups
import itertools
treatments = itertools.cycle(['baseline', 'treatment'])
x = 1
for player in subsession.get_players():
player.treatment=next(treatments)
print('player', x, 'is in condition:', player.treatment)
x += 1
subsession.group_randomly()
def start_timestamp(player: Player):
participant = player.participant
participant.vars['start_time'] = datetime.now()
def end_timestamp(player: Player):
participant = player.participant
participant.vars['end_time'] = datetime.now()
completion_time = participant.vars['end_time'] - participant.vars['start_time']
participant.vars['completion_time'] = completion_time.seconds
def create_lottery(p1, v1, v2):
parameter_list = [p1, v1, v2]
expected_value = p1 * v1 + (1 - p1) * v2
if (v1 != 1) and (v2 != 1):
lottery = f"Mit einer Wahrscheinlichkeit von {p1 * 100}% erhalten Sie {v1} Punkte. Mit einer Wahrscheinlichkeit von {(1 - p1) * 100}% erhalten Sie {v2} Punkte."
elif (v1 == 1) and (v2 != 1):
lottery = f"Mit einer Wahrscheinlichkeit von {p1 * 100}% erhalten Sie {v1} Punkt. Mit einer Wahrscheinlichkeit von {(1 - p1) * 100}% erhalten Sie {v2} Punkte."
elif (v1 != 1) and (v2 == 1):
lottery = f"Mit einer Wahrscheinlichkeit von {p1 * 100}% erhalten Sie {v1} Punkte. Mit einer Wahrscheinlichkeit von {(1 - p1) * 100}% erhalten Sie {v2} Punkt."
return lottery, parameter_list, expected_value
def personalize_lotteries_risk(player: Player):
lottery_A_list = pickle.load(open('lotteries_A.sav', 'rb'))
personalised_lotteries = []
if player.treatment == 'baseline':
for lottery in lottery_A_list:
if lottery['risk_level'] == player.risk_prediction_full:
ID_found = lottery['ID']
elif player.treatment == 'treatment':
for lottery in lottery_A_list:
if lottery['risk_level'] == player.risk_prediction_decfs:
ID_found = lottery['ID']
if ID_found == 0:
ID_presented = [0, 1, 2, 3, 4]
elif ID_found == 1:
ID_presented = [0, 1, 2, 3, 4]
else:
ID_presented = [ID_found - 2,
ID_found - 1,
ID_found,
ID_found + 1,
ID_found + 2]
for lottery in lottery_A_list:
if lottery['ID'] in ID_presented:
personalised_lotteries.append(lottery)
return personalised_lotteries
def extract_risk_level(player: Player):
lottery_A_list = pickle.load(open('lotteries_A.sav', 'rb'))
player.risk_level_revealed = lottery_A_list[player.decision_round_two]["risk_level"]
def BDM_decision(player: Player):
random_threshold = random.randint(0,1000)
player.BDM_result = 1 if player.BDM >= random_threshold else 0
def Calc_spec_endowment(player:Player):
if player.BDM_result == 1:
player.spec_endowment = player.spec_endowment - player.BDM
if player.BDM_result == 0:
player.spec_endowment = player.spec_endowment
def lottery_payoff_sum(player:Player):
random.seed(player.seed)
lotteriesAB = pickle.load(open('lotteries_AB.sav', 'rb'))
lottery_one_selected = lotteriesAB[player.decision_round_one]
lottery_one_payoff = random.choices([lottery_one_selected['value1'], lottery_one_selected['value2']],
weights = (lottery_one_selected['prob'], 1-lottery_one_selected['prob']))[0]
lottery_one_selected_text = lottery_one_selected['text']
lotteriesA = pickle.load(open('lotteries_A.sav', 'rb'))
lottery_two_selected = lotteriesA[player.decision_round_two]
lottery_two_payoff = random.choices([lottery_two_selected['value1'], lottery_two_selected['value2']],
weights=(lottery_two_selected['prob'], 1 - lottery_two_selected['prob']))[0]
lottery_two_selected_text = lottery_two_selected['text']
lottery_payoff_both = int(lottery_one_payoff + lottery_two_payoff)
return dict(lottery_one_payoff=lottery_one_payoff,
lottery_one_selected_text=lottery_one_selected_text,
lottery_two_payoff=lottery_two_payoff,
lottery_two_selected_text=lottery_two_selected_text,
lottery_payoff_both=lottery_payoff_both)
# PAGES
class Introduction(Page):
def before_next_page(player: Player, timeout_happened):
start_timestamp(player)
set_seed(player)
class questionnaire(Page):
form_model = 'player'
form_fields = ["age", "education","height", "sex", "germborn", "smoke",
"sat_health","sat_socialLife","importance_religion",
"check_account","alcohol","importance_involvement","income"]
@staticmethod
def before_next_page(player: Player, timeout_happened):
predict_risk_full(player)
player.unfold_list_tracker = 0
@staticmethod
def vars_for_template(player: Player):
descriptives = ["age", "sex", "height", "germborn", "income", "education"]
Likert_vars_10 = ["sat_socialLife","sat_health"]
importances = ["importance_religion","importance_involvement"]
miscellaneous = ["smoke","alcohol","check_account"]
return dict(descriptives=descriptives,
Likert_vars_10=Likert_vars_10)
class Explanation_of_experiment(Page):
pass
class Lotteries_round_two(Page):
form_model = "player"
form_fields = ["decision_round_two"]
def vars_for_template(player: Player):
lottery_A_list = pickle.load(open('lotteries_A.sav', 'rb'))
lotteries_repr = []
for lottery in lottery_A_list:
if lottery['representative'] == True:
lotteries_repr.append(lottery)
return {"lotteries_repr": lotteries_repr}
@staticmethod
def before_next_page(player: Player, timeout_happened):
extract_risk_level(player)
#class Lotteries_round_two_result(Page):
# form_model = "player"
# def vars_for_template(player: Player):
# lottery_A_list = pickle.load(open('lotteries_A.sav', 'rb'))
# lottery_two_selected = lottery_A_list[player.decision_round_two-1]['text']
# return {"lottery_two_selected": lottery_two_selected}
class Lotteries_round_one_presentation(Page):
form_model = "player"
#form_fields = ["decision_round_one"]
def vars_for_template(player: Player):
lotteries = pickle.load(open('lotteries_AB.sav', 'rb'))
return {"lotteries": lotteries}
class Explanation_of_AI(Page):
pass
class Decentralized_feature_selection(Page):
form_model = 'player'
form_fields = ["age_dummy", "sex_dummy", "height_dummy", "germborn_dummy", "income_dummy", "education_dummy",
"sat_socialLife_dummy", "sat_health_dummy",
"importance_religion_dummy","importance_involvement_dummy",
"check_account_dummy", "alcohol_dummy", 'smoke_dummy'] #todo: Bei neuen features anpassen!
@staticmethod
def is_displayed(player: Player):
return (player.treatment == 'treatment')
@staticmethod
def before_next_page(player: Player, timeout_happened):
predict_risk_decfs(player)
class BDM(Page):
form_model = 'player'
form_fields= ['BDM']
@staticmethod
def before_next_page(player: Player, timeout_happened):
BDM_decision(player)
Calc_spec_endowment(player)
class Variable_evaluation(Page):
form_model = 'player'
form_fields = ["age_evaluation", "sex_evaluation", "height_evaluation", "germborn_evaluation", "income_evaluation",
"education_evaluation", "sat_health_evaluation", "sat_socialLife_evaluation", "importance_religion_evaluation", "check_account_evaluation",
"importance_involvement_evaluation", "smoke_evaluation",
"alcohol_evaluation"] # todo: Bei neuen features anpassen!
class BDM_result(Page):
form_model = 'player'
class Lotteries_round_one_with_AI(Page):
form_model = "player"
form_fields = ["decision_round_one", "unfold_list_tracker"]
def vars_for_template(player: Player):
lotteries_one_personalized = personalize_lotteries_risk(player)
lotteries_one_full = pickle.load(open('lotteries_AB.sav', 'rb'))
return {"lotteries_one_personalized":lotteries_one_personalized,
"lotteries_one_full":lotteries_one_full}
@staticmethod
def is_displayed(player: Player):
return (player.BDM_result == 1)
class Lotteries_round_one_without_AI(Page):
form_model = "player"
form_fields = ["decision_round_one"]
def vars_for_template(player: Player):
lotteries = pickle.load(open('lotteries_AB.sav', 'rb'))
return {"lotteries": lotteries}
@staticmethod
def is_displayed(player: Player):
return (player.BDM_result == 0)
class Lotteries_round_one_result(Page):
form_model = "player"
def vars_for_template(player: Player):
lotteries = pickle.load(open('lotteries_AB.sav', 'rb'))
lottery_one_selected = lotteries[player.decision_round_one]['text']
return {"lottery_one_selected": lottery_one_selected}
class Elicitation_of_model_beliefs(Page):
form_model="player"
form_fields= ["algo_expert", "algo_knowledge",
"feel_secure", "feel_comfortable", "feel_content",
"transparency", "power"]
class Perceived_accuracy(Page):
form_model = "player"
form_fields = ["perceived_accuracy"]
class Perceived_rmse(Page):
form_model = "player"
form_fields = ["perceived_rmse"]
class Attitudes_towards_ai(Page):
form_model="player"
form_fields=["ATAI_fear", "ATAI_trust", "ATAI_destroy_humankind", "ATAI_benefit", "ATAI_job_loss"]
class Lotteries_round_two_result(Page):
form_model = "player"
def vars_for_template(player: Player):
lottery_A_list = pickle.load(open('lotteries_A.sav', 'rb'))
lotteries_repr = []
for lottery in lottery_A_list:
if (lottery['representative'] == True) and (lottery['ID'] == player.decision_round_two):
lottery_two_selected = lottery['text']
return {"lottery_two_selected": lottery_two_selected}
class Results(Page):
form_model = 'player'
def vars_for_template(player: Player):
payoff_list = lottery_payoff_sum(player)
lottery_one_payoff = payoff_list["lottery_one_payoff"]
lottery_one_selected_text = payoff_list["lottery_one_selected_text"]
lottery_two_payoff = payoff_list["lottery_two_payoff"]
lottery_two_selected_text = payoff_list["lottery_two_selected_text"]
lottery_payoff_both = payoff_list["lottery_payoff_both"] + player.spec_endowment
payoff_euro = round((lottery_payoff_both * C.exchange_rate/100),2)
return{"lottery_one_payoff":lottery_one_payoff,
"lottery_one_selected_text":lottery_one_selected_text,
"lottery_two_payoff":lottery_two_payoff,
"lottery_two_selected_text":lottery_two_selected_text,
"lottery_payoff_both":lottery_payoff_both,
"payoff_euro":payoff_euro}
class Final_comments(Page):
form_model = 'player'
form_fields = ['comments']
class Control_page(Page):
form_model = 'player'
form_fields = ['quiz1', 'quiz2']
@staticmethod
def error_message(player, values):
if player.tries_left > 0:
# Add correct solutions to questions in dict below:
solutions = dict(
quiz1=2,
quiz2=2
)
error_messages = dict()
for field_name in solutions:
if values[field_name] != solutions[field_name]:
error_messages = 'Mindestens eine falsche Antwort. Sie haben nur noch einen Versuch!'
if bool(error_messages):
player.tries_left -= 1
return error_messages
@staticmethod
def app_after_this_page(player, upcoming_apps):
if player.tries_left == 0:
return 'exit_app'
page_sequence = [Introduction,
questionnaire,
Explanation_of_experiment,
Lotteries_round_one_presentation,
Explanation_of_AI,
Control_page,
# attention check
Decentralized_feature_selection,
Variable_evaluation,
BDM,
BDM_result, #todo Seiteninhalt
Lotteries_round_one_without_AI,
Lotteries_round_one_with_AI,
Lotteries_round_one_result,
Elicitation_of_model_beliefs,
Attitudes_towards_ai,
Lotteries_round_two,
Lotteries_round_two_result,
Perceived_accuracy,
Perceived_rmse,
Results,
Final_comments
]