from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) from random import randrange import numpy as np author = 'Marco Faillo' doc = """ Two-sided market with two content providers (CP), two ISPs and 150 consumers (50 sophisticated and 100 naive) Part 2. Experiment with payments """ class Constants(BaseConstants): name_in_url = 'zero_rating_3_tarifs_paid' players_per_group = 4 num_rounds = 2 ni_H_hi=9 # model parameter ???? ni_H_low=4.5 #model parameter ???? ni_L_hi =8 # model parameter ???? ni_L_low=2 # model parameter ???? gamma = 0.2375 # model parameter ???? d = 1/1000 # model parameter ???? fix = [4,15, 20, 25] # fixed part of the tariffs extra = [3,1, 0.5, 0.25] #variable part of the tariffs price = [9,15, 25, 38] #price of the tariffs n_consumers_low= 50 #number of naive consumers n_consumers_high =100 #number of sophisticated consumers plots_CP = 'zero_rating_3_tarifs_practice/plots_CP.html' #plots of prices and quantitu sold by CPs w_HI=[1, 1, 1, 1] # model parameter ???? w_L=[1, 1, 1, 1] # model parameter ???? class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for player in self.get_players(): player.participant.vars['tarifs_ISP_1']=[0,0,0,0]# list of tariffs offered by ISP_1 (1 = offered, 0= not offered) player.participant.vars['tarifs_ISP_1_old']=[0,0,0,0]# list of tariffs offered by ISP_1 (1 = offered, 0= not offered) in the previous round player.participant.vars['tarifs_ISP_2'] = [0,0,0,0,] # list of tariffs offered by ISP_2 (1 = offered, 0= not offered) player.participant.vars['tarifs_ISP_2_old'] = [0,0,0,0] # list of tariffs offered by ISP_2 (1 = offered, 0= not offered) in the previous round player.participant.vars['list_p_gen'] = [] #list prices CP generalist player.participant.vars['list_p_spec'] = [] #list prices CP generalist player.participant.vars['list_demand_gen'] = [] # demand of CP generalist player.participant.vars['list_demand_spec'] = [] # demand of CP specialist player.participant.vars['total_rev_gen'] = [] # Cumulative revenue CP generalist player.participant.vars['total_rev_spec'] = [] # Cumulative revenue CP specialist player.participant.vars['total_rev_ISP_1'] = [] # Cumulative revenue ISP_1 player.participant.vars['total_rev_ISP_2'] = [] # Cumulative revenue ISP_2 # player.participant.vars['tarifs_sold_ISP_1'] = [0,0,0,0] # quantità vendute per ciascuna tariffa # player.participant.vars['tarifs_sold_ISP_2'] = [0,0,0,0] # quantità vendute per ciascuna tariffa player.participant.vars['tarifs_sold_ISP_1_old'] = [0,0,0,0] # list of quantity sold for each tariff offered by ISP_1 in the previous round player.participant.vars['tarifs_sold_ISP_2_old'] = [0,0,0,0] # list of quantity sold for each tariff offered by ISP_2 in the previous round player.participant.vars['U_HI'] = [0,0,0,0] # Utility of sophisticated consumers from each tariff player.participant.vars['U_L'] = [0,0,0,0] # Utility of naive consumers from each tariff player.participant.vars['U_ISP_1_HI'] = [-99,-99,-99,-99] # Utility of sophisticated consumers from each tariff offered by ISP_1 player.participant.vars['U_ISP_2_HI'] = [-99,-99,-99,-99] # Utility of sophisticated consumers from each tariff offered by ISP_2 player.participant.vars['U_ISP_1_L'] = [-99,-99,-99,-99] # Utility of naive consumers from each tariff offered by ISP_1 player.participant.vars['U_ISP_2_L'] = [-99,-99,-99,-99] # Utility of naive consumers from each tariff offered by ISP_2 player.participant.vars['tarifs_sold_ISP_1_HI'] = [0,0,0,0] # list of quantity sold to sophisticated consumers for each tariff offered by ISP_1 player.participant.vars['tarifs_sold_ISP_2_HI'] = [0,0,0,0] # list of quantity sold to sophisticated consumers for each tariff offered by ISP_2 player.participant.vars['tarifs_sold_ISP_1_L'] = [0,0,0,0] # list of quantity sold to naive consumers for each tariff offered by ISP_1 player.participant.vars['tarifs_sold_ISP_2_L'] = [0,0,0,0] # list of quantity sold to naive consumers for each tariff offered by ISP_2 player.participant.vars['tarifs_sold_ISP_1_TOT'] = [0,0,0,0] # total number of tariffs sold by ISP_1 player.participant.vars['tarifs_sold_ISP_2_TOT'] = [0,0,0,0] # total number of tariffs sold by ISP_2 class Group(BaseGroup): p_gen_input = models.FloatField(min=0, max=3) # generalist's price input p_spec_input = models.FloatField(min=0, max=10) # specialist's price input p_gen = models.FloatField() # generalist's price plugged in the model p_spec = models.FloatField() # specialists's price plugged in the model individual_demand_gen_low_T1 = models.FloatField() # individual demand by naive consumers for CP generalist, given tariff T1 individual_demand_gen_low_T2 = models.FloatField() # individual demand by naive consumers for CP generalist, given tariff T2 individual_demand_gen_low_T3 = models.FloatField() # individual demand by naive consumers for CP generalist, given tariff T3 individual_demand_gen_low_T4 = models.FloatField() # individual demand by naive consumers for CP generalist, given tariff T4 individual_demand_gen_high_T1 = models.FloatField() # individual demand by sophisticated consumers for CP generalist, given tariff T1 individual_demand_gen_high_T2 = models.FloatField() # individual demand by sophisticated consumers for CP generalist, given tariff T2 individual_demand_gen_high_T3 = models.FloatField() # individual demand by sophisticated consumers for CP generalist, given tariff T3 individual_demand_gen_high_T4 = models.FloatField() # individual demand by sophisticated consumers for CP generalist, given tariff T4 individual_demand_spec_low_T1 = models.FloatField() # individual demand by naive consumers for CP specialist, given tariff T1 individual_demand_spec_low_T2 = models.FloatField() # individual demand by naive consumers for CP specialist, given tariff T2 individual_demand_spec_low_T3 = models.FloatField() # individual demand by naive consumers for CP specialist, given tariff T3 individual_demand_spec_low_T4 = models.FloatField() # individual demand by naive consumers for CP specialist, given tariff T4 individual_demand_spec_high_T1 = models.FloatField() # individual demand by sophisticated consumers for CP specialist, given tariff T1 individual_demand_spec_high_T2 = models.FloatField() # individual demand by sophisticated consumers for CP specialist, given tariff T1 individual_demand_spec_high_T3 = models.FloatField() # individual demand by sophisticated consumers for CP specialist, given tariff T1 individual_demand_spec_high_T4 = models.FloatField() # individual demand by sophisticated consumers for CP specialist, given tariff T1 demand_spec_H = models.FloatField() #total demand for CP specialsit by sophisticated consumers demand_spec_L = models.FloatField() #total demand for CP specialsit by naiveconsumers demand_gen_H = models.FloatField() #total demand for CP generalist by sophisticated consumers demand_gen_L = models.FloatField() #total demand for CP generalist by naive consumers demand_spec_TOT= models.FloatField() #total demand for CP specialistt demand_gen_TOT= models.FloatField() #total demand for CP generalist revenue_CP_gen=models.FloatField() # current round's revenue of CP genealist revenue_CP_spec=models.FloatField() # current round's revenue of CP specialist revenue_ISP_1=models.FloatField() # current round's revenue of ISP_1 revenue_ISP_2=models.FloatField() # current round's revenue of ISP_2 # variables for output demand_ISP_1=models.FloatField() #demand for ISP_1 demand_ISP_2=models.FloatField() #demand for ISP_2 tarif_1_sold_ISP_1=models.FloatField() # units sold for the first tariff offered by ISP_1 tarif_1_sold_ISP_2=models.FloatField() # units sold for the first tariff offered by ISP_2 tarif_2_sold_ISP_1=models.FloatField() # units sold for the second tariff offered by ISP_1 tarif_2_sold_ISP_2=models.FloatField() # units sold for the second tariff offered by ISP_2 tarif_1_sold_old_ISP_1 = models.FloatField() # units sold for the first tariff offered by ISP_1 in the previous round tarif_1_sold_old_ISP_2 = models.FloatField() # units sold for the first tariff offered by ISP_2 in the previous round tarif_2_sold_old_ISP_1 = models.FloatField() # units sold for the second tariff offered by ISP_2 in the previous round tarif_2_sold_old_ISP_2 = models.FloatField() # units second for the second tariff offered by ISP_2 in the previous round p1_ISP_1= models.PositiveIntegerField(choices=[[1, '[1] 4Gb + 3 puntos cada extra Gb. PRECIO: 9 puntos'], [2, '[2] 15Gb + 1 puntos cada extra Gb. PRECIO: 15 puntos'], [3, '[3] 20Gb + 0.5 puntos cada extra Gb. PRECIO: 25 puntos'], [4, '[4] 25Gb + 0.25 puntos cada extra Gb. PRECIO: 38 puntos']]) #input first tarif by ISP_1 p2_ISP_1 = models.PositiveIntegerField(choices=[[1, '[1] 4Gb + 3 puntos cada extra Gb. PRECIO: 9 puntos'], [2, '[2] 15Gb + 1 puntos cada extra Gb. PRECIO: 15 puntos'], [3, '[3] 20Gb + 0.5 puntos cada extra Gb. PRECIO: 25 puntos'], [4, '[4] 25Gb + 0.25 puntos cada extra Gb. PRECIO: 38 puntos']]) #input second tarif by ISP_1 p1_ISP_2= models.PositiveIntegerField(choices=[[1, '[1] 4Gb + 3 puntos cada extra Gb. PRECIO: 9 puntos'], [2, '[2] 15Gb + 1 puntos cada extra Gb. PRECIO: 15 puntos'], [3, '[3] 20Gb + 0.5 puntos cada extra Gb. PRECIO: 25 puntos'], [4, '[4] 25Gb + 0.25 puntos cada extra Gb. PRECIO: 38 puntos']]) #input first tarif by ISP_2 p2_ISP_2= models.PositiveIntegerField(choices=[[1, '[1] [1] 4Gb + 3 puntos cada extra Gb. PRECIO: 9 puntos'], [2, '[2] 15Gb + 1 puntos cada extra Gb. PRECIO: 15 puntos'], [3, '[3] 20Gb + 0.5 puntos cada extra Gb. PRECIO: 25 puntos'], [4, '[4] 25Gb + 0.25 puntos cada extra Gb. PRECIO: 38 puntos']]) #input second tarif by ISP_12 cum_payoff_gen = models.FloatField(initial=0) # cumulative revenue CP generalist cum_payoff_spec = models.FloatField(initial=0) # cumulative revenue CP specialist cum_payoff_ISP_1 = models.FloatField(initial=0) # cumulative revenue CP ISP_1 cum_payoff_ISP_2 = models.FloatField(initial=0) # cumulative revenue CP ISP_1 cum_payoff_gen_euro=models.FloatField(initial=0) # cumulative revenue in euro CP generalist cum_payoff_spec_euro=models.FloatField(initial=0) # cumulative revenue in euro CP generalist cum_payoff_ISP_1_euro=models.FloatField(initial=0) # cumulative revenue in euro ISP_1 cum_payoff_ISP_2_euro=models.FloatField(initial=0) # cumulative revenue in euro ISP_2 # recollect data from previous round to show the tariffs sold by ISP_1 and ISP_2 def recupera_dati(self): if self.subsession.round_number > 1: for player in self.get_players(): player.participant.vars['tarifs_ISP_1']=[0,0,0,0] player.participant.vars['tarifs_ISP_1_old']=[0,0,0,0] player.participant.vars['tarifs_ISP_2'] = [0,0,0,0,] player.participant.vars['tarifs_ISP_2_old'] = [0,0,0,0] # player.participant.vars['tarifs_sold_ISP_1'] = [0,0,0,0] ## list of quantity sold for each tariff offered by ISP_1 # player.participant.vars['tarifs_sold_ISP_2'] = [0,0,0,0] ## list of quantity sold for each tariff offered by ISP_2 player.participant.vars['tarifs_sold_ISP_1_old'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_old'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_HI'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_HI'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_L'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_L'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_TOT'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_TOT'] = [0,0,0,0] self.tarif_1_sold_old_ISP_1=self.in_round(self.subsession.round_number-1).tarif_1_sold_ISP_1 self.tarif_1_sold_old_ISP_2=self.in_round(self.subsession.round_number-1).tarif_1_sold_ISP_2 self.tarif_2_sold_old_ISP_1=self.in_round(self.subsession.round_number-1).tarif_2_sold_ISP_1 self.tarif_2_sold_old_ISP_2=self.in_round(self.subsession.round_number-1).tarif_2_sold_ISP_2 # demand computation def demand (self): self.p_gen = self.p_gen_input/10 #input prices are divided by 10 to plug them into the model self.p_spec = self.p_spec_input/10 ## Computation of demands for CPs # individual demands by sophisticated consumers for CP specialist given computed for each possible tariff self.individual_demand_spec_high_T1 = round(((Constants.ni_H_hi - Constants.d - self.p_spec - Constants.extra[0]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[0])/-(Constants.gamma**2-1))*1,2) print('xS_1=', self.individual_demand_spec_high_T1) self.individual_demand_spec_high_T2 = round(((Constants.ni_H_hi - Constants.d - self.p_spec - Constants.extra[1]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[1])/-(Constants.gamma**2-1))*1,2) print('xS_2=', self.individual_demand_spec_high_T2) self.individual_demand_spec_high_T3 = round(((Constants.ni_H_hi - Constants.d - self.p_spec - Constants.extra[2]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[2])/-(Constants.gamma**2-1))*1,2) print('xS_3=', self.individual_demand_spec_high_T3) self.individual_demand_spec_high_T4 = round(((Constants.ni_H_hi - Constants.d - self.p_spec - Constants.extra[3]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[3])/-(Constants.gamma**2-1))*1,2) print('xS_4=', self.individual_demand_spec_high_T4) # individual demands by naive consumers for CP specialist given computed for each possible tariff self.individual_demand_spec_low_T1 = round(((Constants.ni_L_hi - Constants.d - self.p_spec - Constants.extra[0]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[0])/-(Constants.gamma**2-1))*1,2) print('xL_1=', self.individual_demand_spec_low_T1) self.individual_demand_spec_low_T2 = round(((Constants.ni_L_hi - Constants.d - self.p_spec - Constants.extra[1]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[1])/-(Constants.gamma**2-1))*1,2) print('xL_2=', self.individual_demand_spec_low_T2) self.individual_demand_spec_low_T3 = round(((Constants.ni_L_hi - Constants.d - self.p_spec - Constants.extra[2]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[2])/-(Constants.gamma**2-1))*1,2) print('xL_3=', self.individual_demand_spec_low_T3) self.individual_demand_spec_low_T4 = round(((Constants.ni_L_hi - Constants.d - self.p_spec - Constants.extra[3]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_gen+Constants.gamma*Constants.extra[3])/-(Constants.gamma**2-1))*1,2) print('xL_4=', self.individual_demand_spec_low_T4) # individual demands by sophisticated consumers for CP generalist given computed for each possible tariff self.individual_demand_gen_high_T1 = round(((Constants.ni_H_low - Constants.d - self.p_gen - Constants.extra[0]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[0])/-(Constants.gamma**2-1))*1,2) print('yS_1=', self.individual_demand_gen_high_T1) self.individual_demand_gen_high_T2 = round(((Constants.ni_H_low - Constants.d - self.p_gen - Constants.extra[1]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[1])/-(Constants.gamma**2-1))*1,2) print('yS_2=', self.individual_demand_gen_high_T2) self.individual_demand_gen_high_T3 = round(((Constants.ni_H_low - Constants.d - self.p_gen - Constants.extra[2]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[2])/-(Constants.gamma**2-1))*1,2) print('yS_3=', self.individual_demand_gen_high_T3) self.individual_demand_gen_high_T4 = round(((Constants.ni_H_low - Constants.d - self.p_gen - Constants.extra[3]-Constants.gamma*Constants.ni_H_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[3])/-(Constants.gamma**2-1))*1,2) print('yS_4=', self.individual_demand_gen_high_T4) # individual demands by naive consumers for CP generalist given computed for each possible tariff self.individual_demand_gen_low_T1 = round(((Constants.ni_L_low - Constants.d - self.p_gen - Constants.extra[0]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[0])/-(Constants.gamma**2-1))*1,2) print('yL_1=', self.individual_demand_gen_low_T1) self.individual_demand_gen_low_T2 = round(((Constants.ni_L_low - Constants.d - self.p_gen - Constants.extra[1]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[1])/-(Constants.gamma**2-1))*1,2) print('yL_2=', self.individual_demand_gen_low_T2) self.individual_demand_gen_low_T3 = round(((Constants.ni_L_low - Constants.d - self.p_gen - Constants.extra[2]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[2])/-(Constants.gamma**2-1))*1,2) print('yL_3=', self.individual_demand_gen_low_T3) self.individual_demand_gen_low_T4 = round(((Constants.ni_L_low - Constants.d - self.p_gen - Constants.extra[3]-Constants.gamma*Constants.ni_L_low+Constants.gamma*Constants.d+Constants.gamma*self.p_spec+Constants.gamma*Constants.extra[3])/-(Constants.gamma**2-1))*1,2) print('yL_4=', self.individual_demand_gen_low_T4) # computation of utilities for player in self.get_players(): # in the list tariffs_ISP_x tariffs actually offered are switched to 1 player.participant.vars['tarifs_ISP_1'][self.p1_ISP_1-1]=1 player.participant.vars['tarifs_ISP_1'][self.p2_ISP_1-1]=1 player.participant.vars['tarifs_ISP_2'][self.p1_ISP_2-1]=1 player.participant.vars['tarifs_ISP_2'][self.p2_ISP_2-1]=1 print('offerte ISP_1',player.participant.vars['tarifs_ISP_1']) print('offerte ISP_2',player.participant.vars['tarifs_ISP_2']) # utility of sophisticated consumers for tariff 1 player.participant.vars['U_HI'][0]=round((Constants.ni_H_hi*self.individual_demand_spec_high_T1 - 0.5*(Constants.ni_H_hi**2) + Constants.ni_H_low*self.individual_demand_gen_high_T1 -0.5*(Constants.ni_H_low**2)-Constants.gamma*self.individual_demand_spec_high_T1*self.individual_demand_gen_high_T1)-self.p_spec*self.individual_demand_spec_high_T1-self.p_gen*self.individual_demand_gen_high_T1-Constants.price[0]/30-Constants.extra[0]/30*(max(0,(self.individual_demand_spec_high_T1-Constants.fix[0]/30)))-Constants.extra[0]/30*(max(0,(self.individual_demand_gen_high_T1-Constants.fix[0]/30)))-(Constants.d/Constants.w_HI[0]),2) print('UHI_1=', player.participant.vars['U_HI'][0]) # utility of sophisticated consumers for tariff 2 player.participant.vars['U_HI'][1]=round((Constants.ni_H_hi*self.individual_demand_spec_high_T2 - 0.5*(Constants.ni_H_hi**2) + Constants.ni_H_low*self.individual_demand_gen_high_T2 -0.5*(Constants.ni_H_low**2)-Constants.gamma*self.individual_demand_spec_high_T2*self.individual_demand_gen_high_T2)-self.p_spec*self.individual_demand_spec_high_T2-self.p_gen*self.individual_demand_gen_high_T2-Constants.price[1]/30-Constants.extra[1]/30*(max(0,(self.individual_demand_spec_high_T2-Constants.fix[1]/30)))-Constants.extra[1]/30*(max(0,(self.individual_demand_gen_high_T2-Constants.fix[1]/30)))-(Constants.d/Constants.w_HI[1]),2) print('UHI_2=', player.participant.vars['U_HI'][1]) # utility of sophisticated consumers for tariff 3 player.participant.vars['U_HI'][2]=round((Constants.ni_H_hi*self.individual_demand_spec_high_T3 - 0.5*(Constants.ni_H_hi**2) + Constants.ni_H_low*self.individual_demand_gen_high_T3 -0.5*(Constants.ni_H_low**2)-Constants.gamma*self.individual_demand_spec_high_T3*self.individual_demand_gen_high_T3)-self.p_spec*self.individual_demand_spec_high_T3-self.p_gen*self.individual_demand_gen_high_T3-Constants.price[2]/30-Constants.extra[2]/30*(max(0,(self.individual_demand_spec_high_T3-Constants.fix[2]/30)))-Constants.extra[2]/30*(max(0,(self.individual_demand_gen_high_T3-Constants.fix[2]/30)))-(Constants.d/Constants.w_HI[2]),2) print('UHI_3=',player.participant.vars['U_HI'][2]) # utility of sophisticated consumers for tariff 4 player.participant.vars['U_HI'][3]=round((Constants.ni_H_hi*self.individual_demand_spec_high_T4 - 0.5*(Constants.ni_H_hi**2) + Constants.ni_H_low*self.individual_demand_gen_high_T4 -0.5*(Constants.ni_H_low**2)-Constants.gamma*self.individual_demand_spec_high_T4*self.individual_demand_gen_high_T4)-self.p_spec*self.individual_demand_spec_high_T4-self.p_gen*self.individual_demand_gen_high_T4-Constants.price[3]/30-Constants.extra[3]/30*(max(0,(self.individual_demand_spec_high_T4-Constants.fix[3]/30)))-Constants.extra[3]/30*(max(0,(self.individual_demand_gen_high_T4-Constants.fix[3]/30)))-(Constants.d/Constants.w_HI[3]),2) print('UHI_4=',player.participant.vars['U_HI'][3]) # utility of naive consumers for tariff 1 player.participant.vars['U_L'][0]=round((Constants.ni_L_hi*self.individual_demand_spec_low_T1 - 0.5*(Constants.ni_L_hi**2) + Constants.ni_L_low*self.individual_demand_gen_low_T1 -0.5*(Constants.ni_L_low**2)-Constants.gamma*self.individual_demand_spec_low_T1*self.individual_demand_gen_low_T1)-self.p_spec*self.individual_demand_spec_low_T1-self.p_gen*self.individual_demand_gen_low_T1-Constants.price[0]/30-Constants.extra[0]/30*(max(0,(self.individual_demand_spec_low_T1-Constants.fix[0]/30)))-Constants.extra[0]/30*(max(0,(self.individual_demand_gen_low_T1-Constants.fix[0]/30)))-(Constants.d/Constants.w_L[0]),2) print('UL_0=',player.participant.vars['U_L'][0]) # utility of naive consumers for tariff 2 player.participant.vars['U_L'][1]=round((Constants.ni_L_hi*self.individual_demand_spec_low_T2 - 0.5*(Constants.ni_L_hi**2) + Constants.ni_L_low*self.individual_demand_gen_low_T2 -0.5*(Constants.ni_L_low**2)-Constants.gamma*self.individual_demand_spec_low_T2*self.individual_demand_gen_low_T2)-self.p_spec*self.individual_demand_spec_low_T2-self.p_gen*self.individual_demand_gen_low_T2-Constants.price[1]/30-Constants.extra[1]/30*(max(0,(self.individual_demand_spec_low_T2-Constants.fix[1]/30)))-Constants.extra[1]/30*(max(0,(self.individual_demand_gen_low_T2-Constants.fix[1]/30)))-(Constants.d/Constants.w_L[1]),2) print('UL_1=',player.participant.vars['U_L'][1]) # utility of naive consumers for tariff 3 player.participant.vars['U_L'][2]=round((Constants.ni_L_hi*self.individual_demand_spec_low_T3 - 0.5*(Constants.ni_L_hi**2) + Constants.ni_L_low*self.individual_demand_gen_low_T3 -0.5*(Constants.ni_L_low**2)-Constants.gamma*self.individual_demand_spec_low_T3*self.individual_demand_gen_low_T3)-self.p_spec*self.individual_demand_spec_low_T3-self.p_gen*self.individual_demand_gen_low_T3-Constants.price[2]/30-Constants.extra[2]/30*(max(0,(self.individual_demand_spec_low_T3-Constants.fix[2]/30)))-Constants.extra[2]/30*(max(0,(self.individual_demand_gen_low_T3-Constants.fix[2]/30)))-(Constants.d/Constants.w_L[2]),2) print('UL_2=',player.participant.vars['U_L'][2]) # utility of naive consumers for tariff 4 player.participant.vars['U_L'][3]=round((Constants.ni_L_hi*self.individual_demand_spec_low_T4 - 0.5*(Constants.ni_L_hi**2) + Constants.ni_L_low*self.individual_demand_gen_low_T4 -0.5*(Constants.ni_L_low**2)-Constants.gamma*self.individual_demand_spec_low_T4*self.individual_demand_gen_low_T4)-self.p_spec*self.individual_demand_spec_low_T4-self.p_gen*self.individual_demand_gen_low_T4-Constants.price[3]/30-Constants.extra[3]/30*(max(0,(self.individual_demand_spec_low_T4-Constants.fix[3]/30)))-Constants.extra[3]/30*(max(0,(self.individual_demand_gen_low_T4-Constants.fix[3]/30)))-(Constants.d/Constants.w_L[3]),2) print('UL_3=', player.participant.vars['U_L'][3] ) #computation of the utilities for the tariffs actually offered by the ISPs # Sophisticated consumers for i in range(4): if player.participant.vars['tarifs_ISP_1'][i-1] != 0: player.participant.vars['U_ISP_1_HI'][i-1]=player.participant.vars['U_HI'][i-1] for i in range(4): if player.participant.vars['tarifs_ISP_2'][i-1] != 0: player.participant.vars['U_ISP_2_HI'][i-1]=player.participant.vars['U_HI'][i-1] # Naive consumers for i in range(4): if player.participant.vars['tarifs_ISP_1'][i-1] != 0: player.participant.vars['U_ISP_1_L'][i-1]=player.participant.vars['U_L'][i-1] for i in range(4): if player.participant.vars['tarifs_ISP_2'][i-1] != 0: player.participant.vars['U_ISP_2_L'][i-1]=player.participant.vars['U_L'][i-1] print('U_ISP_1_HI',player.participant.vars['U_ISP_1_HI']) print('U_ISP_2_HI',player.participant.vars['U_ISP_2_HI']) print('U_ISP_1_L',player.participant.vars['U_ISP_1_L']) print('U_ISP_2_L',player.participant.vars['U_ISP_2_L']) #identification of tariffs sold by ISP_1 and U_ISP_2 #sophisticated consumers # ISP_1 is better than ISP_2 if max(player.participant.vars['U_ISP_1_HI']) > max(player.participant.vars['U_ISP_2_HI']) : player.participant.vars['tarifs_sold_ISP_1_HI'][np.argmax(player.participant.vars['U_ISP_1_HI'])]+= Constants.n_consumers_high # ISP_1 is the same as ISP_2 elif max(player.participant.vars['U_ISP_1_HI']) == max(player.participant.vars['U_ISP_2_HI']) : player.participant.vars['tarifs_sold_ISP_1_HI'][np.argmax(player.participant.vars['U_ISP_1_HI'])]+= Constants.n_consumers_high/2 player.participant.vars['tarifs_sold_ISP_2_HI'][np.argmax(player.participant.vars['U_ISP_2_HI'])]+= Constants.n_consumers_high/2 # ISP_2 is better than ISP_1 else: player.participant.vars['tarifs_sold_ISP_2_HI'][np.argmax(player.participant.vars['U_ISP_2_HI'])]+= Constants.n_consumers_high #naive consumers # ISP_1 is better than ISP_2 if max(player.participant.vars['U_ISP_1_L']) > max(player.participant.vars['U_ISP_2_L']): player.participant.vars['tarifs_sold_ISP_1_L'][np.argmax(player.participant.vars['U_ISP_1_L'])]+= Constants.n_consumers_low # ISP_1 is the same as ISP_2 elif max(player.participant.vars['U_ISP_1_L']) == max(player.participant.vars['U_ISP_2_L']): player.participant.vars['tarifs_sold_ISP_1_L'][np.argmax(player.participant.vars['U_ISP_1_L'])]+= Constants.n_consumers_low/2 player.participant.vars['tarifs_sold_ISP_2_L'][np.argmax(player.participant.vars['U_ISP_2_L'])]+= Constants.n_consumers_low/2 # ISP_2 is better than ISP_1 else: player.participant.vars['tarifs_sold_ISP_2_L'][np.argmax(player.participant.vars['U_ISP_2_L'])]+= Constants.n_consumers_low #Total number of tariffs sold (to both naive and sophosticated consumers) by ISPs for i in range (4): player.participant.vars['tarifs_sold_ISP_1_TOT'][i-1]=player.participant.vars['tarifs_sold_ISP_1_HI'][i-1]+player.participant.vars['tarifs_sold_ISP_1_L'][i-1] player.participant.vars['tarifs_sold_ISP_2_TOT'][i-1]=player.participant.vars['tarifs_sold_ISP_2_HI'][i-1]+player.participant.vars['tarifs_sold_ISP_2_L'][i-1] self.demand_ISP_1=sum(player.participant.vars['tarifs_sold_ISP_1_TOT']) self.demand_ISP_2=sum(player.participant.vars['tarifs_sold_ISP_2_TOT']) self.tarif_1_sold_ISP_1 = player.participant.vars['tarifs_sold_ISP_1_TOT'][self.p1_ISP_1-1] self.tarif_1_sold_ISP_2 = player.participant.vars['tarifs_sold_ISP_2_TOT'][self.p1_ISP_2-1] self.tarif_2_sold_ISP_1 = player.participant.vars['tarifs_sold_ISP_1_TOT'][self.p2_ISP_1-1] self.tarif_2_sold_ISP_2 = player.participant.vars['tarifs_sold_ISP_2_TOT'][self.p2_ISP_2-1] print('check tarifs sold',player.participant.vars['tarifs_sold_ISP_1_TOT'], player.participant.vars['tarifs_sold_ISP_2_TOT'],self.tarif_1_sold_ISP_1,self.tarif_1_sold_ISP_2,self.tarif_2_sold_ISP_1 ,self.tarif_2_sold_ISP_2) # Demand by sophisticated consumers for CP speciastist self.demand_spec_H = player.participant.vars['tarifs_sold_ISP_1_HI'][0]*self.individual_demand_spec_high_T1+player.participant.vars['tarifs_sold_ISP_1_HI'][1]*self.individual_demand_spec_high_T2+player.participant.vars['tarifs_sold_ISP_1_HI'][2]*self.individual_demand_spec_high_T3+player.participant.vars['tarifs_sold_ISP_1_HI'][3]*self.individual_demand_spec_high_T4+player.participant.vars['tarifs_sold_ISP_2_HI'][0]*self.individual_demand_spec_high_T1+player.participant.vars['tarifs_sold_ISP_2_HI'][1]*self.individual_demand_spec_high_T2+player.participant.vars['tarifs_sold_ISP_2_HI'][2]*self.individual_demand_spec_high_T3+player.participant.vars['tarifs_sold_ISP_2_HI'][3]*self.individual_demand_spec_high_T4 # Demand by sophisticated consumers for CP generalist self.demand_gen_H = player.participant.vars['tarifs_sold_ISP_1_HI'][0]*self.individual_demand_gen_high_T1+player.participant.vars['tarifs_sold_ISP_1_HI'][1]*self.individual_demand_gen_high_T2+player.participant.vars['tarifs_sold_ISP_1_HI'][2]*self.individual_demand_gen_high_T3+player.participant.vars['tarifs_sold_ISP_1_HI'][3]*self.individual_demand_gen_high_T4+player.participant.vars['tarifs_sold_ISP_2_HI'][0]*self.individual_demand_gen_high_T1+player.participant.vars['tarifs_sold_ISP_2_HI'][1]*self.individual_demand_gen_high_T2+player.participant.vars['tarifs_sold_ISP_2_HI'][2]*self.individual_demand_gen_high_T3+player.participant.vars['tarifs_sold_ISP_2_HI'][3]*self.individual_demand_gen_high_T4 # Demand by naive consumers for CP speciastist self.demand_spec_L = player.participant.vars['tarifs_sold_ISP_1_L'][0]*self.individual_demand_spec_high_T1+player.participant.vars['tarifs_sold_ISP_1_L'][1]*self.individual_demand_spec_high_T2+player.participant.vars['tarifs_sold_ISP_1_L'][2]*self.individual_demand_spec_high_T3+player.participant.vars['tarifs_sold_ISP_1_L'][3]*self.individual_demand_spec_high_T4+player.participant.vars['tarifs_sold_ISP_2_L'][0]*self.individual_demand_spec_high_T1+player.participant.vars['tarifs_sold_ISP_2_L'][1]*self.individual_demand_spec_high_T2+player.participant.vars['tarifs_sold_ISP_2_L'][2]*self.individual_demand_spec_high_T3+player.participant.vars['tarifs_sold_ISP_2_L'][3]*self.individual_demand_spec_high_T4 # Demand by naive consumers for CP generalist self.demand_gen_L = player.participant.vars['tarifs_sold_ISP_1_L'][0]*self.individual_demand_gen_high_T1+player.participant.vars['tarifs_sold_ISP_1_L'][1]*self.individual_demand_gen_high_T2+player.participant.vars['tarifs_sold_ISP_1_L'][2]*self.individual_demand_gen_high_T3+player.participant.vars['tarifs_sold_ISP_1_L'][3]*self.individual_demand_gen_high_T4+player.participant.vars['tarifs_sold_ISP_2_L'][0]*self.individual_demand_gen_high_T1+player.participant.vars['tarifs_sold_ISP_2_L'][1]*self.individual_demand_gen_high_T2+player.participant.vars['tarifs_sold_ISP_2_L'][2]*self.individual_demand_gen_high_T3+player.participant.vars['tarifs_sold_ISP_2_L'][3]*self.individual_demand_gen_high_T4 # Total demands (both by naive and sophisticated) for CPs self.demand_spec_TOT= self.demand_spec_H*Constants.n_consumers_high+self.demand_spec_L*Constants.n_consumers_low self.demand_gen_TOT= self.demand_gen_H*Constants.n_consumers_high+self.demand_gen_L*Constants.n_consumers_low # Revenue of CP generalist self.revenue_CP_gen=self.demand_gen_TOT*self.p_gen # Revenue of CP specialist self.revenue_CP_spec=self.demand_spec_TOT*self.p_spec # Revenue of ISP_1 (considering the parameters of each tariff and the tariff actually sold) self.revenue_ISP_1=(player.participant.vars['tarifs_sold_ISP_1_HI'][0]*Constants.price[0])+Constants.extra[0]*player.participant.vars['tarifs_sold_ISP_1_HI'][0]*max(0,self.individual_demand_spec_high_T1-Constants.fix[0])+(player.participant.vars['tarifs_sold_ISP_1_L'][0]*Constants.price[0])+Constants.extra[0]*player.participant.vars['tarifs_sold_ISP_1_L'][0]*max(0,self.individual_demand_spec_low_T1-Constants.fix[0]) self.revenue_ISP_1+=(player.participant.vars['tarifs_sold_ISP_1_HI'][1]*Constants.price[1])+Constants.extra[1]*player.participant.vars['tarifs_sold_ISP_1_HI'][1]*max(0,self.individual_demand_spec_high_T2-Constants.fix[1])+(player.participant.vars['tarifs_sold_ISP_1_L'][1]*Constants.price[1])+Constants.extra[1]*player.participant.vars['tarifs_sold_ISP_1_L'][1]*max(0,self.individual_demand_spec_low_T2-Constants.fix[1]) self.revenue_ISP_1+=(player.participant.vars['tarifs_sold_ISP_1_HI'][2]*Constants.price[2])+Constants.extra[2]*player.participant.vars['tarifs_sold_ISP_1_HI'][2]*max(0,self.individual_demand_spec_high_T3-Constants.fix[2])+(player.participant.vars['tarifs_sold_ISP_1_L'][2]*Constants.price[2])+Constants.extra[2]*player.participant.vars['tarifs_sold_ISP_1_L'][2]*max(0,self.individual_demand_spec_low_T3-Constants.fix[2]) self.revenue_ISP_1+=(player.participant.vars['tarifs_sold_ISP_1_HI'][3]*Constants.price[3])+Constants.extra[3]*player.participant.vars['tarifs_sold_ISP_1_HI'][3]*max(0,self.individual_demand_spec_high_T4-Constants.fix[3])+(player.participant.vars['tarifs_sold_ISP_1_L'][3]*Constants.price[3])+Constants.extra[3]*player.participant.vars['tarifs_sold_ISP_1_L'][3]*max(0,self.individual_demand_spec_low_T4-Constants.fix[3]) # Revenue of ISP_2 self.revenue_ISP_2=(player.participant.vars['tarifs_sold_ISP_2_HI'][0]*Constants.price[0])+Constants.extra[0]*player.participant.vars['tarifs_sold_ISP_2_HI'][0]*max(0,self.individual_demand_spec_high_T1-Constants.fix[0])+(player.participant.vars['tarifs_sold_ISP_2_L'][0]*Constants.price[0])+Constants.extra[0]*player.participant.vars['tarifs_sold_ISP_2_L'][0]*max(0,self.individual_demand_spec_low_T1-Constants.fix[0]) self.revenue_ISP_2+=(player.participant.vars['tarifs_sold_ISP_2_HI'][1]*Constants.price[1])+Constants.extra[1]*player.participant.vars['tarifs_sold_ISP_2_HI'][1]*max(0,self.individual_demand_spec_high_T2-Constants.fix[1])+(player.participant.vars['tarifs_sold_ISP_2_L'][1]*Constants.price[1])+Constants.extra[1]*player.participant.vars['tarifs_sold_ISP_2_L'][1]*max(0,self.individual_demand_spec_low_T2-Constants.fix[1]) self.revenue_ISP_2+=(player.participant.vars['tarifs_sold_ISP_2_HI'][2]*Constants.price[2])+Constants.extra[2]*player.participant.vars['tarifs_sold_ISP_2_HI'][2]*max(0,self.individual_demand_spec_high_T3-Constants.fix[2])+(player.participant.vars['tarifs_sold_ISP_2_L'][2]*Constants.price[2])+Constants.extra[2]*player.participant.vars['tarifs_sold_ISP_2_L'][2]*max(0,self.individual_demand_spec_low_T3-Constants.fix[2]) self.revenue_ISP_2+=(player.participant.vars['tarifs_sold_ISP_2_HI'][3]*Constants.price[3])+Constants.extra[3]*player.participant.vars['tarifs_sold_ISP_2_HI'][3]*max(0,self.individual_demand_spec_high_T4-Constants.fix[3])+(player.participant.vars['tarifs_sold_ISP_2_L'][3]*Constants.price[3])+Constants.extra[3]*player.participant.vars['tarifs_sold_ISP_2_L'][3]*max(0,self.individual_demand_spec_low_T4-Constants.fix[3]) #sorting of tariffs offered by ISP_1 and ISP_2 player.participant.vars['tarifs_ISP_1'].sort() player.participant.vars['tarifs_ISP_2'].sort() def set_payoff(self): #update lists of prices, demands and revenues for player in self.get_players(): player.participant.vars['list_p_gen'].append(self.p_gen_input) player.participant.vars['list_p_spec'].append(self.p_spec_input) player.participant.vars['list_demand_gen'].append(self.demand_gen_TOT) player.participant.vars['list_demand_spec'].append(self.demand_spec_TOT) player.participant.vars['total_rev_gen'].append(self.revenue_CP_gen) player.participant.vars['total_rev_spec'].append(self.revenue_CP_spec) player.participant.vars['total_rev_ISP_1'].append(self.revenue_ISP_1) player.participant.vars['total_rev_ISP_2'].append(self.revenue_ISP_2) #Compute cumulative payoffs self.cum_payoff_gen=sum(player.participant.vars['total_rev_gen']) self.cum_payoff_spec=sum(player.participant.vars['total_rev_spec']) self.cum_payoff_ISP_1=sum(player.participant.vars['total_rev_ISP_1']) self.cum_payoff_ISP_2=sum(player.participant.vars['total_rev_ISP_2']) # reset of practice variables and lists (runs at round 1 of the paid experiment) def azzera(self): self.demand_gen_TOT=0 self.demand_spec_TOT=0 self.demand_ISP_1=0 self.demand_ISP_1=0 for player in self.get_players(): player.participant.vars['total_rev_gen']=[] player.participant.vars['total_rev_spec']=[] player.participant.vars['total_rev_ISP_1']=[] player.participant.vars['total_rev_ISP_2']=[] player.participant.vars['list_p_gen']=[] player.participant.vars['list_p_spec']=[] player.participant.vars['list_demand_gen']=[] player.participant.vars['list_demand_spec']=[] player.participant.vars['tarifs_ISP_1']=[0,0,0,0] player.participant.vars['tarifs_ISP_1_old']=[0,0,0,0] player.participant.vars['tarifs_ISP_2'] = [0,0,0,0,] player.participant.vars['tarifs_ISP_2_old'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_old'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_old'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_HI'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_HI'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_L'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_L'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_1_TOT'] = [0,0,0,0] player.participant.vars['tarifs_sold_ISP_2_TOT'] = [0,0,0,0] class Player(BasePlayer): #socio demographics age = models.IntegerField() gender = models.IntegerField( choices = [[1, 'Mujer'], [0, 'Hombre']], ) experiments = models.IntegerField() major = models.StringField() nat = models.StringField() euro = models.FloatField() # final payoment in euro #role setting def role(self): if self.id_in_group == 1: return 'generalist' elif self.id_in_group == 2: return 'specialist' elif self.id_in_group == 3: return 'ISP_1' else: return 'ISP_2' #compute individual payments in euros def set_euro(self): if self.id_in_group == 1: print(self.group.cum_payoff_gen_euro) self.euro = self.group.cum_payoff_gen*0.10/5000 print(self.euro) elif self.id_in_group == 2: print(self.group.cum_payoff_spec_euro) self.euro= self.group.cum_payoff_spec*0.10/5000 print(self.euro) elif self.id_in_group == 3: print(self.group.cum_payoff_ISP_1_euro) self.euro=self.group.cum_payoff_ISP_1*0.10/1000 print(self.euro) else: print(self.group.cum_payoff_ISP_2_euro) self.euro = self.group.cum_payoff_ISP_2*0.10/1000 print(self.euro)