def test_5_results(self): reducer = SlimReducer() result = reducer.reduce([ CollapseResult(stoline('|001110 |'), 2), None, CollapseResult(stoline('| 00111|'), 5), None, CollapseResult(stoline('| 111 |'), 7) ], 7) self.assertArrayEqual(result.line, stoline('| 1 |')) self.assertEqual(result.count, 14)
def reduce(self, results, length): '''Combine results from multiple divisions Args: combinations (Iterable[CollapsedResult|None]): iterable of all division results length (int): length of a line/section Returns: CollapseResult|None: a reduction result ''' non_empty_results = [ *filter(lambda result: result is not None, results) ] if len(non_empty_results) == 0: return None count = sum(l.count for l in non_empty_results) collapsed = np.array([l.line for l in non_empty_results], Cell.dtype) reduced = (Cell.FILLED if (column == Cell.FILLED).all() else Cell.CROSSED if (column == Cell.CROSSED).all() else Cell.EMPTY for column in collapsed.T) return CollapseResult(np.fromiter(reduced, Cell.dtype, length), count)
def inplace(): self.metrics.add_event(('sub_collapse', 'inplace')) move_space = calculate_moves(task, len(field_line)) if len(task) == 1 and move_space == 0: return CollapseResult.filled(len(field_line), 1) count = calculate_count(task, len(field_line)) if move_space >= max(task): return CollapseResult.empty(len(field_line), count) def stack_left_ends(): start = 0 for block in task: yield start + block start += block + MIN_BLOCK_SPACE def stack_right_starts(): start = move_space for block in task: yield start start += block + MIN_BLOCK_SPACE filled_indecies = [ i for start, end in zip(stack_right_starts(), stack_left_ends()) for i in range(start, end) ] line = np.full(len(field_line), Cell.EMPTY, Cell.dtype) line[filled_indecies] = Cell.FILLED return CollapseResult(line, count)
def reduce(self, results, length): '''Combine results from multiple divisions as steam on each cycle to a single accumulated value Args: combinations (Iterable[CollapsedResult|None]): iterable of all division results length (int): length of a line/section Returns: CollapseResult|None: a reduction result ''' accumulated = None count = 0 for result in results: if result is None: continue count += result.count if accumulated is None: accumulated = result.line.copy() continue for i in range(length): if accumulated[i] != result.line[i]: accumulated[i] = Cell.EMPTY return CollapseResult(accumulated, count) if accumulated is not None else None
def test_2_results(self): reducer = SlimReducer() result = reducer.reduce( [CollapseResult(stoline('|0011100|'), 1), None], 7) self.assertArrayEqual(result.line, stoline('|0011100|')) self.assertEqual(result.count, 1)