in LA-MCTS/lamcts/Classifier.py [0:0]
def propose_rand_samples_sobol(self, nums_samples, path, lb, ub):
#rejected sampling
selected_cands = np.zeros((1, self.dims))
seed = np.random.randint(int(1e6))
sobol = SobolEngine(dimension = self.dims, scramble=True, seed=seed)
# scale the samples to the entire search space
# ----------------------------------- #
# while len(selected_cands) <= nums_samples:
# cands = sobol.draw(100000).to(dtype=torch.float64).cpu().detach().numpy()
# cands = (ub - lb)*cands + lb
# for node in path:
# boundary = node[0].classifier.svm
# if len(cands) == 0:
# return []
# cands = cands[ boundary.predict(cands) == node[1] ] # node[1] store the direction to go
# selected_cands = np.append( selected_cands, cands, axis= 0)
# print("total sampled:", len(selected_cands) )
# return cands
# ----------------------------------- #
#shrink the cands region
ratio_check, centers = self.get_sample_ratio_in_region(self.X, path)
# no current samples located in the region
# should not happen
# print("ratio check:", ratio_check, len(self.X) )
# assert ratio_check > 0
if ratio_check == 0 or len(centers) == 0:
return self.propose_rand_samples( nums_samples, lb, ub )
lb_ = None
ub_ = None
final_cands = []
for center in centers:
center = self.X[ np.random.randint( len(self.X) ) ]
cands = sobol.draw(2000).to(dtype=torch.float64).cpu().detach().numpy()
ratio = 1
L = 0.0001
Blimit = np.max(ub - lb)
while ratio == 1 and L < Blimit:
lb_ = np.clip( center - L/2, lb, ub )
ub_ = np.clip( center + L/2, lb, ub )
cands_ = cp.deepcopy( cands )
cands_ = (ub_ - lb_)*cands_ + lb_
ratio, cands_ = self.get_sample_ratio_in_region(cands_, path)
if ratio < 1:
final_cands.extend( cands_.tolist() )
L = L*2
final_cands = np.array( final_cands )
if len(final_cands) > nums_samples:
final_cands_idx = np.random.choice( len(final_cands), nums_samples )
return final_cands[final_cands_idx]
else:
if len(final_cands) == 0:
return self.propose_rand_samples( nums_samples, lb, ub )
else:
return final_cands