Пример #1
0
    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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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]
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
 def get_d(self):
     y = random.random()
     i = bin_search(self.cdf_d, y)
     return i + self.min_outd