Skip to content

Commit 7fcd710

Browse files
committed
random_loop_arrays: allow 1st linker in exp loops
1 parent 3ecce71 commit 7fcd710

1 file changed

Lines changed: 24 additions & 14 deletions

File tree

looplib/random_loop_arrays.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,47 @@ def exponential_loop_array(
2323
loop_size,
2424
spacing,
2525
min_loop_size=3,
26-
loop_spacing_distr='uniform'):
26+
loop_spacing_distr='uniform',
27+
skip_first_spacer=True,
28+
resize=True):
2729

2830
looplens = []
2931
spacers = []
3032
cumL = 0
3133
while True:
32-
looplens.append(min_loop_size
33-
+ np.round(np.random.exponential(loop_size-min_loop_size)))
34-
if loop_spacing_distr == 'exp':
35-
spacers.append(
36-
max(1, int(np.round(np.random.exponential(spacing-1)))))
37-
elif loop_spacing_distr == 'uniform':
38-
spacers.append(spacing)
34+
if cumL == 0 and skip_first_spacer:
35+
spacer = 0
3936
else:
40-
raise ValueError('Unknown distribution of loop spacers')
37+
if loop_spacing_distr == 'exp':
38+
spacer = max(1, int(np.round(np.random.exponential(spacing-1))))
39+
elif loop_spacing_distr == 'uniform':
40+
spacer = spacing
41+
else:
42+
raise ValueError('Unknown distribution of loop spacers')
43+
44+
spacers.append(spacer)
45+
46+
loop_len = min_loop_size + np.round(np.random.exponential(loop_size-min_loop_size))
47+
looplens.append(loop_len)
48+
4149

42-
cumL += looplens[-1] + spacers[-1]
50+
cumL += + spacers[-1] + looplens[-1]
4351
if cumL > N-1:
4452
if len(looplens) > 1:
45-
looplens.pop(len(looplens) - 1)
4653
spacers.pop(len(spacers) - 1)
54+
looplens.pop(len(looplens) - 1)
4755
break
4856

4957
looplens, spacers = np.array(looplens), np.array(spacers)
50-
looplens = looplens * float(N - 1 - spacers.sum()) / (looplens.sum())
58+
if resize:
59+
looplens = looplens * float(N - 1 - spacers.sum()) / (looplens.sum())
5160

52-
loopstarts = np.r_[0, np.cumsum(looplens+spacers)[:-1]]
61+
loopstarts = spacers[0] + np.r_[0, np.cumsum(looplens[:-1]+spacers[1:])]
5362
loops = np.vstack([np.round(loopstarts), np.round(loopstarts + looplens)]).T
5463
loops = loops.astype('int')
5564

56-
return loops
65+
return loops, looplens, spacers
66+
5767

5868

5969
def exponential_overlapping_loop_array(

0 commit comments

Comments
 (0)