from otree.api import Currency as c, currency_range import csv import pandas as pd import numpy as np import pickle import json import random from ._builtin import Page, WaitPage from .models import Constants class Choose(Page): # def vars_for_template(self): # # x=self.player.choice # # print(self.player.choice) # cont1 = "A" # cont2 = "B" # return {"cont1":cont1,"cont2":cont2} form_model='player' form_fields=['choice','justification','risk'] def choice_choices(self): match_key = "match" + str(self.round_number) if match_key in self.participant.vars: y = [i for i in Constants.menu.copy() if i[0] != self.participant.vars[match_key][0]] y = [i for i in y if i[0] != self.participant.vars[match_key][1]] for j in Constants.menu.copy(): if j[0] == self.participant.vars[match_key][0]: z0=j elif j[0] == self.participant.vars[match_key][1]: z1 = j y.insert(0,z1) y.insert(0,z0) x = y else: while 1: x = Constants.menu.copy() random.shuffle(x) is_new = self.player.new_match((x[0],x[1])) if is_new: self.participant.vars[match_key]=(x[0][0],x[1][0]) break # print(self.participant.vars["fighters"]) return x class Instructions(Page): form_model='player' def is_displayed(self): return self.round_number == 1 class Returns(Page): def vars_for_template(self): # print(self.round_number) vals_key = "vals"+str(self.round_number) if vals_key in self.participant.vars: vals = self.participant.vars[vals_key] else: if self.player.risk == "low": ret = .058 risk = 0.15043083502499 elif self.player.risk == "med": ret=.07 risk = 0.28235165629082 elif self.player.risk == "high": ret=.072 risk = 0.365046397266246 if "max" in self.player.choice: ret += .005 elif "min" in self.player.choice: risk -= .02 # elif "tax" in self.player.choice: # ret *= 82/80 vals=[10000] for i in range(10): rnd = np.exp(np.random.normal(ret,risk)) if rnd > 1: if "tax" in self.player.choice: rnd = 1+(rnd-1)*.92 else: rnd = 1+(rnd-1)*.9 vals.append(round(vals[-1]*rnd,0)) if vals[-1]>100000: vals[-1]=round(90000+np.random.normal(0,20),0) self.participant.vars[vals_key]=vals if "payoffs" in self.participant.vars: payoffs = self.participant.vars["payoffs"] payoffs.append(vals[-1]) self.participant.vars["payoffs"]=payoffs else: self.participant.vars["payoffs"]=[vals[-1]] return {"vals":vals} form_model='player' form_fields=["port_val"] class LastPay(Page): def vars_for_template(self): pays={} for i in self.player.in_all_rounds(): pays_key = "pay"+str(i.round_number) pays[pays_key]=(i.round_number,i.port_val) if "final_round" in self.participant.vars: final_round = self.participant.vars["final_round"] else: final_round = random.randrange(1, len(self.player.in_all_rounds())+1) self.participant.vars["final_round"]=final_round final_pay = pays["pay"+str(final_round)][1] return {"pays":pays, "round":final_round, "payout":final_pay} form_model='player' def is_displayed(self): return self.round_number == 2 page_sequence = [ # Instructions, Choose, Returns, # LastPay ]