from otree.api import * import numpy as np import random c = cu doc = '' def kprob(k): numitems = len(k['weights']) prob = [1]*len(k['weights']) for item in np.arange(0,numitems): prob[item] = models.IntegerField( initial = 0, choices=[[0, 'Excluded from the knapsack'], [1, 'Included in the knapsack']], label = str("Item "+str(item+1)) ) return prob class Constants(BaseConstants): name_in_url = 'knapsack' players_per_group = None num_rounds = 1 k0 = {'weights' : [10,5,15], 'values' : [11,3,13], 'capacity' : 20} k1s = {'weights' : [2,4,6,3], 'values' : [2,3,4,5], 'capacity': 10} k2s = {'weights':[5,13,6,9], 'values': [6,9,8,7], 'capacity': 20} k3s = {'weights':[2,4,7,7], 'values':[6,5,8,9], 'capacity': 10} k1c = {'weights':[750,406,564,595,803,489,641,177,330,252], 'values':[500,350,505,505,640,435,465,50,220,170], 'capacity':1900} k2c = {'weights':[205,252,352,447,114,50,28,251,19,20], 'values':[300,350,400,450,47,20,8,70,5,5], 'capacity':1044} k3c = {'weights':[21,97,32,21,52,75,86,116,43,54], 'values':[31,141,46,30,74,105,119,160,59,71], 'capacity':265} # K = [k1s,k2s,k3s,k1s,k2c,k3c] # w0 = (10, 5, 15) # v0 = (11, 3, 13) # c0 = 20 # o0 = 16 # tasks = np.arange(0,len(K)) # num_rounds = len(tasks) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # k0_0 = models.IntegerField(choices=[[0, 'Excluded from the knapsack'], [1, 'Included in the knapsack']], initial=0, label='Item 1') # k0_1 = models.IntegerField(choices=[[0, 'Excluded from the knapsack'], [1, 'Included in the knapsack']], initial=0, label='Item 2') # k0_2 = models.IntegerField(choices=[[0, 'Excluded from the knapsack'], [1, 'Included in the knapsack']], initial=0, label='Item 3') k0_0, k0_1, k0_2 = kprob(Constants.k0) k1s_0,k1s_1,k1s_2,k1s_3 = kprob(Constants.k1s) k2s_0,k2s_1,k2s_2,k2s_3 = kprob(Constants.k2s) k3s_0,k3s_1,k3s_2,k3s_3 = kprob(Constants.k3s) k1c_0,k1c_1,k1c_2,k1c_3,k1c_4,k1c_5,k1c_6,k1c_7,k1c_8,k1c_9 = kprob(Constants.k1c) k2c_0,k2c_1,k2c_2,k2c_3,k2c_4,k2c_5,k2c_6,k2c_7,k2c_8,k2c_9 = kprob(Constants.k2c) k3c_0,k3c_1,k3c_2,k3c_3,k3c_4,k3c_5,k3c_6,k3c_7,k3c_8,k3c_9 = kprob(Constants.k1c) treatment = models.StringField() def creating_session(subsession: Subsession): # randomize to treatments for player in subsession.get_players(): player.treatment = random.choice(['simple','complex']) print('set player.treatment to', player.treatment) def custom_export(players): yield ['participant_code', 'id_in_group'] for p in players: pp = p.participant yield [pp.code, p.id_in_group] class KnapTrain(Page): pass class KnapsackTrain(Page): form_model = 'player' form_fields = ['k0_0', 'k0_1', 'k0_2'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k0['weights'], v = Constants.k0['values'], c = Constants.k0['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k0['weights'],\ [values['k0_0'],values['k0_1'],values['k0_2']])) \ > Constants.k0['capacity']: return 'Your knapsack weighs too much! Try a different combination.' class KnapsackResult(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k0['weights'], v = Constants.k0['values'], c = Constants.k0['capacity'], \ tw = np.sum(np.multiply(Constants.k0['weights'],[player.k0_0,player.k0_1,player.k0_2])), \ tv = np.sum(np.multiply(Constants.k0['values'],[player.k0_0,player.k0_1,player.k0_2])), \ ov = 16) class K1S(Page): form_model = 'player' form_fields = ['k1s_0','k1s_1','k1s_2','k1s_3'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k1s['weights'], v = Constants.k1s['values'], c = Constants.k1s['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k1s['weights'],\ [values['k1s_0'],values['k1s_1'],values['k1s_2'], values['k1s_3']])) \ > Constants.k1s['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'simple' class K1SR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k1s['weights'], v = Constants.k1s['values'], c = Constants.k1s['capacity'], \ tw = np.sum(np.multiply(Constants.k1s['weights'],[player.k1s_0,player.k1s_1,player.k1s_2, player.k1s_3])), \ tv = np.sum(np.multiply(Constants.k1s['values'],[player.k1s_0,player.k1s_1,player.k1s_2, player.k1s_3])), \ ov = 10) def is_displayed(player: Player): return player.treatment == 'simple' class K2S(Page): form_model = 'player' form_fields = ['k2s_0','k2s_1','k2s_2','k2s_3'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k2s['weights'], v = Constants.k2s['values'], c = Constants.k2s['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k2s['weights'],\ [values['k2s_0'],values['k2s_1'],values['k2s_2'], values['k2s_3']])) \ > Constants.k2s['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'simple' class K2SR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k2s['weights'], v = Constants.k2s['values'], c = Constants.k2s['capacity'], \ tw = np.sum(np.multiply(Constants.k2s['weights'],[player.k2s_0,player.k2s_1,player.k2s_2, player.k2s_3])), \ tv = np.sum(np.multiply(Constants.k2s['values'],[player.k2s_0,player.k2s_1,player.k2s_2, player.k2s_3])), \ ov = 21) def is_displayed(player: Player): return player.treatment == 'simple' class K3S(Page): form_model = 'player' form_fields = ['k3s_0','k3s_1','k3s_2','k3s_3'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k3s['weights'], v = Constants.k3s['values'], c = Constants.k3s['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k3s['weights'],\ [values['k3s_0'],values['k3s_1'],values['k3s_2'], values['k3s_3']])) \ > Constants.k3s['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'simple' class K3SR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k3s['weights'], v = Constants.k3s['values'], c = Constants.k3s['capacity'], \ tw = np.sum(np.multiply(Constants.k3s['weights'],[player.k3s_0,player.k3s_1,player.k3s_2, player.k3s_3])), \ tv = np.sum(np.multiply(Constants.k3s['values'],[player.k3s_0,player.k3s_1,player.k3s_2, player.k3s_3])), \ ov = 15) def is_displayed(player: Player): return player.treatment == 'simple' class K1C(Page): form_model = 'player' form_fields = ['k1c_0','k1c_1','k1c_2','k1c_3','k1c_4','k1c_5','k1c_6','k1c_7','k1c_8','k1c_9'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k1c['weights'], v = Constants.k1c['values'], c = Constants.k1c['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k1c['weights'],\ [values['k1c_0'],values['k1c_1'],values['k1c_2'],values['k1c_3'],\ values['k1c_4'],values['k1c_5'],values['k1c_6'],values['k1c_7'],\ values['k1c_8'],values['k1c_9']])) \ > Constants.k1c['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'complex' class K1CR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k1c['weights'], v = Constants.k1c['values'], c = Constants.k1c['capacity'], \ tw = np.sum(np.multiply(Constants.k1c['weights'],\ [player.k1c_0,player.k1c_1,player.k1c_2,player.k1c_3,\ player.k1c_4,player.k1c_5,player.k1c_6,player.k1c_7,\ player.k1c_8,player.k1c_9])), \ tv = np.sum(np.multiply(Constants.k1c['values'],\ [player.k1c_0,player.k1c_1,player.k1c_2,player.k1c_3,\ player.k1c_4,player.k1c_5,player.k1c_6,player.k1c_7,\ player.k1c_8,player.k1c_9])), \ ov = 1615) def is_displayed(player: Player): return player.treatment == 'complex' class K2C(Page): form_model = 'player' form_fields = ['k2c_0','k2c_1','k2c_2','k2c_3','k2c_4','k2c_5','k2c_6','k2c_7','k2c_8','k2c_9'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k2c['weights'], v = Constants.k2c['values'], c = Constants.k2c['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k2c['weights'],\ [values['k2c_0'],values['k2c_1'],values['k2c_2'],values['k2c_3'],\ values['k2c_4'],values['k2c_5'],values['k2c_6'],values['k2c_7'],\ values['k2c_8'],values['k2c_9']])) \ > Constants.k2c['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'complex' class K2CR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k2c['weights'], v = Constants.k2c['values'], c = Constants.k2c['capacity'], \ tw = np.sum(np.multiply(Constants.k2c['weights'],\ [player.k2c_0,player.k2c_1,player.k2c_2,player.k2c_3,\ player.k2c_4,player.k2c_5,player.k2c_6,player.k2c_7,\ player.k2c_8,player.k2c_9])), \ tv = np.sum(np.multiply(Constants.k2c['values'],\ [player.k2c_0,player.k2c_1,player.k2c_2,player.k2c_3,\ player.k2c_4,player.k2c_5,player.k2c_6,player.k2c_7,\ player.k2c_8,player.k2c_9])), \ ov = 1160) def is_displayed(player: Player): return player.treatment == 'complex' class K3C(Page): form_model = 'player' form_fields = ['k3c_0','k3c_1','k3c_2','k3c_3','k3c_4','k3c_5','k3c_6','k3c_7','k3c_8','k3c_9'] timeout_seconds = 240 @staticmethod def vars_for_template(player): return dict(w = Constants.k3c['weights'], v = Constants.k3c['values'], c = Constants.k3c['capacity']) @staticmethod def error_message(player, values): print('values is', values) if np.sum(np.multiply(Constants.k3c['weights'],\ [values['k3c_0'],values['k3c_1'],values['k3c_2'],values['k3c_3'],\ values['k3c_4'],values['k3c_5'],values['k3c_6'],values['k3c_7'],\ values['k3c_8'],values['k3c_9']])) \ > Constants.k3c['capacity']: return 'Your knapsack weighs too much! Try a different combination.' def is_displayed(player: Player): return player.treatment == 'complex' class K3CR(Page): form_model = 'player' @staticmethod def vars_for_template(player): return dict(w = Constants.k3c['weights'], v = Constants.k3c['values'], c = Constants.k3c['capacity'], \ tw = np.sum(np.multiply(Constants.k3c['weights'],\ [player.k3c_0,player.k3c_1,player.k3c_2,player.k3c_3,\ player.k3c_4,player.k3c_5,player.k3c_6,player.k3c_7,\ player.k3c_8,player.k3c_9])), \ tv = np.sum(np.multiply(Constants.k3c['values'],\ [player.k3c_0,player.k3c_1,player.k3c_2,player.k3c_3,\ player.k3c_4,player.k3c_5,player.k3c_6,player.k3c_7,\ player.k3c_8,player.k3c_9])), \ ov = 375) def is_displayed(player: Player): return player.treatment == 'complex' # class K1S(Page): # form_model = 'player' # form_fields = ['k1s_0', 'k1s_1', 'k1s_2','k1s_3'] # timeout_seconds = 240 # @staticmethod # def vars_for_template(player): # return dict(w = Constants.k1s['weights'], v = Constants.k1s['values'], c = Constants.k1s['capacity']) # @staticmethod # def error_message(player, values): # print('values is', values) # if Constants.k1s['values'][0]*values['k1s_0'] + Constants.k0['values'][1]*values['k0_1'] +\ # Constants.k0['values'][2]*values['k0_2'] > Constants.k0['capacity']: # return 'Your knapsack weighs too much! Try a different combination.' # class KnapsackResult(Page): # form_model = 'player' # @staticmethod # def vars_for_template(player): # return dict(w = Constants.k0['weights'], v = Constants.k0['values'], c = Constants.k0['capacity'], \ # tw = np.multiply(Constants.k0['weights'],[player.k0_0,player.k0_1,player.k0_2]), \ # tv = np.multiply(Constants.k0['values'],[player.k0_0,player.k0_1,player.k0_2]), \ # ov = 16) page_sequence = [KnapTrain, KnapsackTrain, KnapsackResult, K1S, K1SR, K1C, K1CR, K2S, K2SR, K2C, K2CR, K3S, K3SR, K3C, K3CR]