diff --git a/applications/arts/doc/python/arts_sc1.py b/applications/arts/doc/python/arts_sc1.py index 0ddc34a4b9ee50174151aad4c72d3c5379d0b445..86df064dbb55ba1e43091dff5381141518b6185b 100644 --- a/applications/arts/doc/python/arts_sc1.py +++ b/applications/arts/doc/python/arts_sc1.py @@ -42,7 +42,7 @@ N_POL = 2 # Number of polarizations N_BAND = 16 # Number of bands # Serial (time) dimensions N_INT_X = 800000 # Number of time samples per corrrelator intergration period -N_SLOT = 1024 #FIXME we need global indices here, don't we? +N_SLOT = 1024 # Number of beamlet slots on single BF FN W_BEAMLET = 6 # Complex beamlet data width nof_intervals = 0 # Unlimited runtime @@ -57,25 +57,18 @@ data_width = N_POL*W_BEAMLET parallel_definition = (('dish', N_DISH), ('polarization', N_POL), ('band', N_BAND)) serial_definition = (('interval', nof_intervals, T_INT_X),('timesample', N_INT_X), ('slot', N_SLOT)) -CB444 = StreamArray(parallel_definition, serial_definition, data_width, block_size=1024) +CB444 = StreamArray(parallel_definition, serial_definition, data_width, block_size=1024, nof_blocks=1) # Print dish 0, pol 0, band (front node) 0: for i in CB444[0][0][0]: - print i['dish'] - break -for i in CB444[0][0][1]: - print i['dish'] - break + print i['slot'] + ############################################################################### # Equation 2: transpose the band and dish (physical) dimensions of CB444: flip dimensions 0 and 2 ############################################################################### -CB444_T = CB444.transpose((2,1,0)) #NOTE transpose works. How to print this nicely? +CB444_T = CB444.transpose((2,1,0)) for i in CB444_T[0][0][0]: print i['dish'] - break -for i in CB444_T[0][0][1]: - print i['dish'] - break diff --git a/applications/arts/doc/python/stream.py b/applications/arts/doc/python/stream.py index 6929ed5a8158517b2b116ef35ecb66fa0a23d006..e60a85d4001f413badb2c5e0d0623b996f14caf6 100644 --- a/applications/arts/doc/python/stream.py +++ b/applications/arts/doc/python/stream.py @@ -7,7 +7,7 @@ class Stream: """ Single serial stream generator """ - def __init__(self, parallel_definition, serial_definition, data_width, block_size): + def __init__(self, parallel_definition, serial_definition, data_width, block_size, nof_blocks): # Parallel definition: physical stream tags and indices for this serial stream self.parallel_definition = parallel_definition @@ -34,32 +34,39 @@ class Stream: self.serial_data_out.append(dimension-1) # Create an interval out counter. Initialize to -1 as there is no maximum self.interval_out = -1 + self.block_size = block_size - self.last_block_lo = 0 - self.last_block_hi = block_size + self.nof_blocks = nof_blocks + self.out_count = 0 def next(self): - block = [] - for i in range(self.block_size): - # Start with the fastest changing dimension (index -1). When we have e.g. 2 dimensions, don't go beyond index -2. - for dimension_index in range(-1, -(self.nof_serial_dimensions+1), -1): - if self.serial_data_out[dimension_index]==self.serial_dimensions[dimension_index]-1: - # Max of this dimension reached; reset to 0 - self.serial_data_out[dimension_index]=0 - # If this is the highest dimension, this is the last value of this interval. - if dimension_index==-(self.nof_serial_dimensions): - self.interval_out+=1 - else: - # Max not reached; increment index - self.serial_data_out[dimension_index]+=1 - break - block.append(tuple(self.parallel_indices)+tuple([self.interval_out]+(self.serial_data_out))) - - # Zip the tags with datatype 'int' (fixed for now) to pass to np.array. This makes array dimensions viewable - # by name, which is essential. - np_dtype = zip(self.parallel_tags+self.serial_tags, (len(self.parallel_tags)+self.nof_serial_dimensions+1)*['int']) # Do add the interval dimension here - np_block = np.array(block, np_dtype) - return np_block + # Break out of the generator loop when we've output nof_blocks + if self.nof_blocks>0 and self.out_count==self.nof_blocks: + self.out_count = 0 + raise StopIteration + else: + self.out_count+=1 + block = [] + for i in range(self.block_size): + # Start with the fastest changing dimension (index -1). When we have e.g. 2 dimensions, don't go beyond index -2. + for dimension_index in range(-1, -(self.nof_serial_dimensions+1), -1): + if self.serial_data_out[dimension_index]==self.serial_dimensions[dimension_index]-1: + # Max of this dimension reached; reset to 0 + self.serial_data_out[dimension_index]=0 + # If this is the highest dimension, this is the last value of this interval. + if dimension_index==-(self.nof_serial_dimensions): + self.interval_out+=1 + else: + # Max not reached; increment index + self.serial_data_out[dimension_index]+=1 + break + block.append(tuple(self.parallel_indices)+tuple([self.interval_out]+(self.serial_data_out))) + + # Zip the tags with datatype 'int' (fixed for now) to pass to np.array. This makes array dimensions viewable + # by name, which is essential. + np_dtype = zip(self.parallel_tags+self.serial_tags, (len(self.parallel_tags)+self.nof_serial_dimensions+1)*['int']) # Do add the interval dimension here + np_block = np.array(block, np_dtype) + return np_block def __iter__(self): return self @@ -67,12 +74,10 @@ class Stream: class StreamArray(np.ndarray): """ - NOTE: Use get() functions instead of fixed attributes as indexing a subset of StreamArray should yield e.g. - a different data rate than the full array. - NOTE: An ESSENTIAL property of subclassing numpy array is that method return values *DEPEND ON THE INDEXED SUBSTREAMS*! - . e.g. pass substream to Component without the difficulties of component_class.py! + User can limit the generated output using nof_intervals (highest dimension = still large amount of output) + or nof_blocks (lowest dimension = small amount of output). 0=unlimited. """ - def __new__(cls, parallel_definition, serial_definition, data_width, block_size): + def __new__(cls, parallel_definition, serial_definition, data_width, block_size, nof_blocks): # We need the parallel dimensions here, but we'll pass the parallel tags to the serial Stream instances. parallel_tags = [pair[0] for pair in parallel_definition] parallel_dimensions = [pair[1] for pair in parallel_definition] @@ -84,7 +89,7 @@ class StreamArray(np.ndarray): for index in np.ndindex(tuple(parallel_dimensions)): parallel_definition = zip(parallel_tags, index) # Replace the dimension size in the parallel_definition with the actual stream index - streams.append(Stream(parallel_definition, serial_definition, data_width, block_size)) + streams.append(Stream(parallel_definition, serial_definition, data_width, block_size, nof_blocks)) input_array = np.array(streams) input_array.resize(parallel_dimensions)