def cross(self, p1, p2):
        board = Board()
        split = random.randint(0, p1.board.shape()[1])

        for i in range(split):
            board.set_column(i, p1.board.get_column(i))
        for i in range(split, p1.board.shape()[1]):
            board.set_column(i, p2.board.get_column(i))

        board.invariants = InvariantsMerger.merge_invariants(p1, p2, self.__area_function(split))

        genotype = BoardGenotype(board)
        return genotype
    def cross(self, p1, p2):
        board = Board()
        squares_num = p1.board.shape()[0] / 3 * p2.board.shape()[1] / 3
        split = random.randint(0, squares_num)

        for i in range(split):
            row_num, col_num = board.get_square_indices(i)
            board.set_square(row_num, col_num, p1.board.get_square(row_num, col_num))

        for i in range(split, p1.board.shape()[1]):
            row_num, col_num = board.get_square_indices(i)
            board.set_square(row_num, col_num, p1.board.get_square(row_num, col_num))

        board.invariants = InvariantsMerger.merge_invariants(p1, p2,
                                                             self.__area_function(board.get_square_indices(split)))

        genotype = BoardGenotype(board)
        return genotype