def _constrained_sum_sample_pos(n, total):
# in this setting, there will be no empty groups generated by this function
n = int(n)
total = int(total)
normalized_list = [int(total) + 1]
while sum(normalized_list) > total and np.greater_equal(normalized_list, np.zeros(n)).all():
indicator = True
while indicator:
normalized_list = list(map(round, map(lambda x: x * total, np.random.dirichlet(np.ones(n), 1).tolist()[0])))
normalized_list = list(map(int, normalized_list))
indicator = len(normalized_list) - np.count_nonzero(normalized_list) != 0
sum_ = 0
for ind, q in enumerate(normalized_list):
if ind < len(normalized_list) - 1:
sum_ += q
# TODO: there is a bug here; sometimes it assigns -1 to the end of the array, but pass the while condition
normalized_list[len(normalized_list) - 1] = abs(total - sum_)
assert sum(normalized_list) == total, "ERROR: the constrainedSumSamplePos-sampled list does not sum to #edges."
return map(str, normalized_list)
评论列表
文章目录