def get_j(self): # if (not self.cdf_j) and (not self.idx_j): # self.cdf_j, self.idx_j = self.get_cdf(self.C, False) y = max(random.random(), self.cdf_j[0]) # method 1 i = bin_search(self.cdf_j, y) # method 2 # j = bin_search(self.step_cdf_j, y) # if self.step_cdf_j[j] == y: # i = self.step_idx_j[j] # else: # left = self.step_idx_j[j-1] # right = self.step_idx_j[j] + 1 # i = bin_search(self.cdf_j[left:right], y) + left # end method # ans = 0 if self.cdf_j[i] > y: a = self.idx_j[i-1] b = self.idx_j[i] c = self.cdf_j[i-1] d = self.cdf_j[i] try: ans = a + int((y - c) * (b - a) / (d - c)) except ZeroDivisionError: ans = a # print(self.cdf_j) # raise e else: ans = self.idx_j[i] # return transform(self.is_even, ans, self.node-1) return ans
def generate_random_path(self, matrix, first_node, length, star): g = self.graph current_node = first_node path = [0 for _ in range(2 * length + 1)] if current_node < 0: size = len(g) t_l = [0 for _ in range(size)] t_l[0] = matrix[length][0] for i in range(1, size): t_l[i] = t_l[i - 1] + matrix[length][i] current_node = bin_search(t_l, random.randint(1, t_l[size - 1])) idx = 0 path[idx] = current_node idx += 1 for i in range(length, 0, -1): if current_node in g[current_node] and random.random() <= star: path[idx] = 1 path[idx + 1] = current_node idx += 2 else: rand_num = random.randint(1, matrix[i][current_node]) acc = 0 for j in g[current_node]: acc += matrix[i - 1][j] if acc >= rand_num: current_node = j path[idx] = 0 path[idx + 1] = current_node idx += 2 break return path
def get_d_(self): # if not self.cdf_d: # self.cdf_d = self.get_cdf(self.c) # x = random.random() # if x > self.select_dp: # return 0 y = random.random() i = bin_search(self.cdf_d, y) return i + self.dmin
def get_j(self): y = max(random.random(), self.cdf_j[0]) i = bin_search(self.cdf_j, y) if self.cdf_j[i] > y: a = self.idx_j[i-1] b = self.idx_j[i] c = self.cdf_j[i-1] d = self.cdf_j[i] try: return a + int((y - c) * (b - a) / (d - c)) except ZeroDivisionError: return a else: return self.idx_j[i]
def __get_j__(self, rv): y = rv i = bin_search(self.inj_cdf, y) i = min(i, self.dnum) if self.inj_cdf[i] > y: a = self.inj_idx[i - 1] b = self.inj_idx[i] c = self.inj_cdf[i - 1] d = self.inj_cdf[i] try: ans = a + int((y - c) * (b - a) / (d - c)) except ZeroDivisionError: ans = a else: ans = self.inj_idx[i] return ans
def get_j(self): y = max(random.random(), self.inj_cdf[0]) i = bin_search(self.inj_cdf, y) i = min(i, self.dnum) if self.inj_cdf[i] > y: a = self.inj_idx[i - 1] b = self.inj_idx[i] c = self.inj_cdf[i - 1] d = self.inj_cdf[i] try: ans = a + int((y - c) * (b - a) / (d - c)) except ZeroDivisionError: ans = a else: ans = self.inj_idx[i] return ans
def get_d(self): y = random.random() i = bin_search(self.cdf_d, y) return i + self.min_outd