def __init__(self, name, hparams, optimizer='RMS'):

        self.name = name
        self.hparams = hparams
        self.latent_dim = self.hparams.layer_sizes[-1]

        # Gaussian prior for each beta_i
        self._lambda_prior = self.hparams.lambda_prior

        self.mu = [
            np.zeros(self.latent_dim) for _ in range(self.hparams.num_actions)
        ]

        self.cov = [(1.0 / self.lambda_prior) * np.eye(self.latent_dim)
                    for _ in range(self.hparams.num_actions)]

        self.precision = [
            self.lambda_prior * np.eye(self.latent_dim)
            for _ in range(self.hparams.num_actions)
        ]
        self.mu_prior_flag = self.hparams.mu_prior_flag
        self.sigma_prior_flag = self.hparams.sigma_prior_flag

        self.precision_prior = self.precision[:]
        self.mu_prior = np.zeros((self.latent_dim, self.hparams.num_actions))
        # Inverse Gamma prior for each sigma2_i
        self._a0 = self.hparams.a0
        self._b0 = self.hparams.b0

        self.a = [self._a0 for _ in range(self.hparams.num_actions)]
        self.b = [self._b0 for _ in range(self.hparams.num_actions)]

        # Regression and NN Update Frequency
        self.update_freq_lr = hparams.training_freq
        self.update_freq_nn = hparams.training_freq_network

        self.t = 0
        self.optimizer_n = optimizer

        self.num_epochs = hparams.training_epochs
        self.data_h = ContextualDataset(hparams.context_dim,
                                        hparams.num_actions,
                                        intercept=False,
                                        buffer_s=hparams.mem)
        self.latent_h = ContextualDataset(self.latent_dim,
                                          hparams.num_actions,
                                          intercept=False,
                                          buffer_s=hparams.mem)
        self.bnn = NeuralBanditModel(optimizer, hparams, '{}-bnn'.format(name))
    def __init__(self, name, hparams, textflag='no', optimizer='RMS'):

        self.first_train = False
        self.name = name
        self.hparams = hparams
        self.latent_dim = self.hparams.layer_sizes[-1]
        self.intercept = False

        self.pgd_steps = self.hparams.pgd_steps
        self.pgd_batch_size = self.hparams.pgd_batch_size

        if self.intercept:
            self.param_dim = 1 + self.latent_dim
        else:
            self.param_dim = self.latent_dim
        self.EPSILON = 0.00001
        # Gaussian prior for each beta_i
        self._lambda_prior = self.hparams.lambda_prior
        self.before = []
        self.after = []

        self.mu = [
            np.zeros(self.param_dim) for _ in range(self.hparams.num_actions)
        ]
        self.f = [
            np.zeros(self.param_dim) for _ in range(self.hparams.num_actions)
        ]
        self.yy = [0 for _ in range(self.hparams.num_actions)]
        self.cov = [(1.0 / self.lambda_prior) * np.eye(self.param_dim)
                    for _ in range(self.hparams.num_actions)]

        self.precision = [
            self.lambda_prior * np.eye(self.param_dim)
            for _ in range(self.hparams.num_actions)
        ]
        self.mu_prior_flag = self.hparams.mu_prior_flag
        self.sigma_prior_flag = self.hparams.sigma_prior_flag

        self.precision_prior = [
            self.lambda_prior * np.eye(self.param_dim)
            for _ in range(self.hparams.num_actions)
        ]

        self.mu_prior = np.zeros((self.param_dim, self.hparams.num_actions))
        # Inverse Gamma prior for each sigma2_i
        self._a0 = self.hparams.a0
        self._b0 = self.hparams.b0

        self.a = [self._a0 for _ in range(self.hparams.num_actions)]
        self.b = [self._b0 for _ in range(self.hparams.num_actions)]

        # Regression and NN Update Frequency
        self.update_freq_lr = hparams.training_freq
        self.update_freq_nn = hparams.training_freq_network

        self.t = 0
        self.optimizer_n = optimizer

        self.num_epochs = hparams.training_epochs
        self.data_h = ContextualDataset(hparams.context_dim,
                                        hparams.num_actions,
                                        intercept=False,
                                        buffer_s=hparams.mem)
        self.latent_h = ContextualDataset(self.latent_dim,
                                          hparams.num_actions,
                                          intercept=self.intercept,
                                          buffer_s=hparams.mem)
        if textflag == 'yes':
            self.bnn = TextCNN('adam', self.hparams.num_actions,
                               self.hparams.batch_size, '{}-bnn'.format(name))
        else:
            self.bnn = NeuralBanditModel(optimizer, hparams,
                                         '{}-bnn'.format(name))