# the indices are generated by using natural-looking nested loops
def iterate_indices(SVSHAPE):
# get indices to iterate over, in the required order
- n = SVSHAPE.lims[SVSHAPE.order[0]]
+ n = SVSHAPE.lims[0]
# createing lists of indices to iterate over in each dimension
# has to be done dynamically, because it depends on the size
# first, the size-based loop (which can be done statically)
x_r.append(size)
size *= 2
# invert order if requested
- if SVSHAPE.invxyz[SVSHAPE.order[0]]: x_r.reverse()
+ if SVSHAPE.invxyz[0]: x_r.reverse()
+
+ if len(x_r) == 0:
+ return
# start an infinite (wrapping) loop
skip = 0
for i in range(0, n, size):
y_r.append(i)
# invert if requested
- if SVSHAPE.invxyz[SVSHAPE.order[1]]: y_r.reverse()
+ if SVSHAPE.invxyz[1]: y_r.reverse()
for i in y_r: # loop over 2nd order dimension
k_r = []
j_r = []
j_r.append(j)
k += tablestep
# invert if requested
- if SVSHAPE.invxyz[SVSHAPE.order[2]]: k_r.reverse()
- if SVSHAPE.invxyz[SVSHAPE.order[2]]: j_r.reverse()
+ if SVSHAPE.invxyz[2]: k_r.reverse()
+ if SVSHAPE.invxyz[2]: j_r.reverse()
for j, k in zip(j_r, k_r): # loop over 1st order dimension
# skip the first entries up to offset
if skip < SVSHAPE.offset:
skip += 1
continue
# now depending on MODE return the index
- if SVSHAPE.mode == 0b00:
+ if SVSHAPE.skip == 0b00:
result = j # for vec[j]
- elif SVSHAPE.mode == 0b01:
+ elif SVSHAPE.skip == 0b01:
result = j + halfsize # for vec[j+halfsize]
- elif SVSHAPE.mode == 0b10:
+ elif SVSHAPE.skip == 0b10:
result = k # for exptable[k]
yield result
def demo():
# set the dimension sizes here
- xdim = 16
+ xdim = 8
ydim = 0 # not needed
zdim = 0 # again, not needed
SVSHAPE0 = SVSHAPE()
SVSHAPE0.lims = [xdim, ydim, zdim]
SVSHAPE0.order = [0,1,2] # experiment with different permutations, here
- SVSHAPE0.mode = 0b00
+ SVSHAPE0.mode = 0b01
+ SVSHAPE0.skip = 0b00
SVSHAPE0.offset = 0 # experiment with different offset, here
SVSHAPE0.invxyz = [0,0,0] # inversion if desired
# j+halfstep schedule
SVSHAPE1.lims = [xdim, ydim, zdim]
SVSHAPE1.order = [0,1,2] # experiment with different permutations, here
SVSHAPE1.mode = 0b01
+ SVSHAPE1.skip = 0b01
SVSHAPE1.offset = 0 # experiment with different offset, here
SVSHAPE1.invxyz = [0,0,0] # inversion if desired
# k schedule
SVSHAPE2 = SVSHAPE()
SVSHAPE2.lims = [xdim, ydim, zdim]
SVSHAPE2.order = [0,1,2] # experiment with different permutations, here
- SVSHAPE2.mode = 0b10
+ SVSHAPE2.mode = 0b01
+ SVSHAPE2.skip = 0b10
SVSHAPE2.offset = 0 # experiment with different offset, here
SVSHAPE2.invxyz = [0,0,0] # inversion if desired