def load(self, file_history, file_training=None, file_predictor=None): """ Loading files about history, training and predictor. Parameters ---------- file_history: str The name of the file that stores the information of the history. file_training: str The name of the file that stores the training dataset. file_predictor: str The name of the file that stores the predictor dataset. Returns ------- """ self.history.load(file_history) if file_training is None: N = self.history.total_num_search X = self.test.X[self.history.chosen_actions[0:N], :] t = self.history.fx[0:N] self.training = variable(X=X, t=t) else: self.training = variable() self.training.load(file_training) if file_predictor is not None: with open(file_predictor, "rb") as f: self.predictor = pickle.load(f)
def write(self, action, t, X=None): """ Writing history (update history, not output to a file). Parameters ---------- action: numpy.ndarray Indexes of actions. t: numpy.ndarray N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). X: numpy.ndarray N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. Returns ------- """ if X is None: X = self.test.X[action, :] Z = self.test.Z[action, :] if self.test.Z is not None else None else: Z = self.predictor.get_basis( X) if self.predictor is not None else None self.history.write(t, action) self.training.add(X=X, t=t, Z=Z) if self.new_data is None: self.new_data = variable(X=X, t=t, Z=Z) else: self.new_data.add(X=X, t=t, Z=Z)
def _get_marginal_score(self, mode, chosen_actions, K, alpha): """ Getting marginal scores. Parameters ---------- mode: str The type of aquision funciton. TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. These functions are defined in score.py. chosen_actions: numpy.ndarray Array of selected actions. K: int The total number of search candidates. alpha: float not used. Returns ------- f: list N dimensional scores (score is defined in each mode) """ f = np.zeros((K, len(self.actions)), dtype=float) new_test_local = self.test.get_subset(chosen_actions) if self.mpisize == 1: new_test = new_test_local else: new_test = variable() for nt in self.mpicomm.allgather(new_test_local): new_test.add(X=nt.X, t=nt.t, Z=nt.Z) virtual_t = self.predictor.get_predict_samples(self.training, new_test, K) for k in range(K): predictor = copy.deepcopy(self.predictor) train = copy.deepcopy(self.training) virtual_train = new_test virtual_train.t = virtual_t[k, :] if virtual_train.Z is None: train.add(virtual_train.X, virtual_train.t) else: train.add(virtual_train.X, virtual_train.t, virtual_train.Z) predictor.update(train, virtual_train) f[k, :] = self.get_score(mode, predictor=predictor, training=train, parallel=False) return np.mean(f, axis=0)
def __init__(self, test_X, config=None, initial_data=None, comm=None): """ Parameters ---------- test_X: numpy.ndarray or physbo.variable The set of candidates. Each row vector represents the feature vector of each search candidate. config: set_config object (physbo.misc.set_config) initial_data: tuple[np.ndarray, np.ndarray] The initial training datasets. The first elements is the array of actions and the second is the array of value of objective functions comm: MPI.Comm, optional MPI Communicator """ self.predictor = None self.training = variable() self.new_data = None self.test = self._make_variable_X(test_X) self.actions = np.arange(0, self.test.X.shape[0]) self.history = history() if config is None: self.config = set_config() else: self.config = config if initial_data is not None: if len(initial_data) != 2: msg = "ERROR: initial_data should be 2-elements tuple or list (actions and objectives)" raise RuntimeError(msg) actions, fs = initial_data if len(actions) != len(fs): msg = "ERROR: len(initial_data[0]) != len(initial_data[1])" raise RuntimeError(msg) self.write(actions, fs) self.actions = sorted(list(set(self.actions) - set(actions))) if comm is None: self.mpicomm = None self.mpisize = 1 self.mpirank = 0 else: self.mpicomm = comm self.mpisize = comm.size self.mpirank = comm.rank self.actions = np.array_split(self.actions, self.mpisize)[self.mpirank] self.config.learning.is_disp = self.mpirank == 0
def _make_variable_X(self, test_X): """ Make a new *variable* with X=test_X Parameters ---------- test_X: numpy.ndarray or physbo.variable The set of candidates. Each row vector represents the feature vector of each search candidate. Returns ------- test_X: numpy.ndarray or physbo.variable The set of candidates. Each row vector represents the feature vector of each search candidate. """ if isinstance(test_X, np.ndarray): test = variable(X=test_X) elif isinstance(test_X, variable): test = test_X else: raise TypeError( "The type of test_X must be ndarray or physbo.variable") return test