예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
        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)
예제 #4
0
    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
예제 #5
0
    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)