def test__numbering__uses_mask_correctly(simple_mask_5x5, cross_mask):

    convolver = aa.Convolver(
        mask=simple_mask_5x5,
        kernel=aa.Kernel2D.ones(shape_native=(1, 1), pixel_scales=1.0),
    )

    mask_index_array = convolver.mask_index_array

    assert mask_index_array.shape == (5, 5)
    # noinspection PyUnresolvedReferences
    assert (mask_index_array == np.array([
        [-1, -1, -1, -1, -1],
        [-1, 0, 1, 2, -1],
        [-1, 3, 4, 5, -1],
        [-1, 6, 7, 8, -1],
        [-1, -1, -1, -1, -1],
    ])).all()

    convolver = aa.Convolver(mask=cross_mask,
                             kernel=aa.Kernel2D.ones(shape_native=(1, 1),
                                                     pixel_scales=1.0))

    assert (convolver.mask_index_array == np.array([
        [-1, -1, -1, -1, -1],
        [-1, -1, 0, -1, -1],
        [-1, 1, 2, 3, -1],
        [-1, -1, 4, -1, -1],
        [-1, -1, -1, -1, -1],
    ])).all()
def test__convolution__cross_mask_with_blurring_entries__returns_array():

    cross_mask = aa.Mask2D.manual(
        mask=[
            [True, True, True, True, True],
            [True, True, False, True, True],
            [True, False, False, False, True],
            [True, True, False, True, True],
            [True, True, True, True, True],
        ],
        pixel_scales=0.1,
        sub_size=1,
    )

    kernel = aa.Kernel2D.manual_native(array=[[0, 0.2, 0], [0.2, 0.4, 0.2],
                                              [0, 0.2, 0]],
                                       pixel_scales=0.1)

    convolver = aa.Convolver(mask=cross_mask, kernel=kernel)

    image_array = aa.Array2D.manual_mask(array=[1, 0, 0, 0, 0],
                                         mask=cross_mask)

    blurring_mask = cross_mask.blurring_mask_from_kernel_shape(
        kernel_shape_native=kernel.shape_native)

    blurring_array = aa.Array2D.manual_mask(
        array=[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        mask=blurring_mask)

    result = convolver.convolve_image(image=image_array,
                                      blurring_image=blurring_array)

    assert (np.round(result, 1) == np.array([0.6, 0.2, 0.2, 0.0, 0.0])).all()
def test__even_kernel_failure():

    with pytest.raises(exc.ConvolverException):
        aa.Convolver(
            mask=np.full((3, 3), False),
            kernel=aa.Kernel2D.ones(shape_native=(2, 2), pixel_scales=1.0),
        )
def test__blurring_frame_indexes__blurring_region_3x3_kernel(cross_mask):

    convolver = aa.Convolver(mask=cross_mask,
                             kernel=aa.Kernel2D.ones(shape_native=(3, 3),
                                                     pixel_scales=1.0))

    assert (convolver.blurring_frame_1d_indexes[4] == np.array(
        [0, 1, 2, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_indexes[5] == np.array(
        [0, 2, 3, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_indexes[10] == np.array(
        [1, 2, 4, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_indexes[11] == np.array(
        [2, 3, 4, -1, -1, -1, -1, -1, -1])).all()
def test__frame_extraction__frame_and_kernel_frame_at_coords(simple_mask_5x5):

    convolver = aa.Convolver(
        mask=simple_mask_5x5,
        kernel=aa.Kernel2D.manual_native(
            [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]],
            pixel_scales=1.0),
    )

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(2, 2),
        mask=simple_mask_5x5,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (frame == np.array([i for i in range(9)])).all()

    assert (kernel_frame == np.array(
        [[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]])).all()

    corner_frame = np.array([0, 1, 3, 4, -1, -1, -1, -1, -1])

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(1, 1),
        mask=simple_mask_5x5,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (frame == corner_frame).all()

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(1, 1),
        mask=simple_mask_5x5,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (kernel_frame == np.array([5.0, 6.0, 8.0, 9.0, -1, -1, -1, -1,
                                      -1])).all()

    assert 9 == len(convolver.image_frame_1d_indexes)

    assert (convolver.image_frame_1d_indexes[4] == np.array(
        [i for i in range(9)])).all()
def test__blurring_frame_kernels__blurring_region_3x3_kernel(cross_mask):

    convolver = aa.Convolver(
        mask=cross_mask,
        kernel=aa.Kernel2D.manual_native(
            [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]],
            pixel_scales=1.0),
    )

    assert (convolver.blurring_frame_1d_kernels[4] == np.array(
        [6.0, 8.0, 9.0, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_kernels[5] == np.array(
        [4.0, 7.0, 8.0, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_kernels[10] == np.array(
        [2.0, 3.0, 6.0, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.blurring_frame_1d_kernels[11] == np.array(
        [1.0, 2.0, 4.0, -1, -1, -1, -1, -1, -1])).all()
def test__frame_lengths__frames_are_from_examples_above__lengths_are_right(
        simple_mask_2d_7x7):

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.ones(shape_native=(3, 5), pixel_scales=1.0),
    )

    # convolver_image.image_frame_indexes[0] == np.array([0, 1, 2, 3, 4, 5])
    # convolver_image.image_frame_indexes[1] == np.array([0, 1, 2, 3, 4, 5])
    # convolver_image.image_frame_indexes[2] == np.array([0, 1, 2, 3, 4, 5])
    # convolver_image.image_frame_indexes[3] == np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    # (convolver_image.image_frame_indexes[4] == np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    # convolver_image.image_frame_indexes[5] == np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    # convolver_image.image_frame_indexes[6] == np.array([3, 4, 5, 6, 7, 8])
    # convolver_image.image_frame_indexes[7] == np.array([3, 4, 5, 6, 7, 8])
    # convolver_image.image_frame_indexes[8] == np.array([3, 4, 5, 6, 7, 8])

    assert (convolver.image_frame_1d_lengths == np.array(
        [6, 6, 6, 9, 9, 9, 6, 6, 6])).all()
def test__compare_to_full_2d_convolution():
    # Setup a blurred data, using the PSF to perform the convolution in 2D, then masks it to make a 1d array.

    import scipy.signal

    mask = aa.Mask2D.circular(shape_native=(30, 30),
                              pixel_scales=(1.0, 1.0),
                              sub_size=1,
                              radius=4.0)
    kernel = aa.Kernel2D.manual_native(array=np.arange(49).reshape(7, 7),
                                       pixel_scales=1.0)
    image = aa.Array2D.manual_native(array=np.arange(900).reshape(30, 30),
                                     pixel_scales=1.0)

    blurred_image_via_scipy = scipy.signal.convolve2d(image.native,
                                                      kernel.native,
                                                      mode="same")
    blurred_image_via_scipy = aa.Array2D.manual_native(
        array=blurred_image_via_scipy, pixel_scales=1.0)
    blurred_masked_image_via_scipy = aa.Array2D.manual_mask(
        array=blurred_image_via_scipy.native, mask=mask)

    # Now reproduce this data using the frame convolver_image

    masked_image = aa.Array2D.manual_mask(array=image.native, mask=mask)

    blurring_mask = mask.blurring_mask_from_kernel_shape(
        kernel_shape_native=kernel.shape_native)

    convolver = aa.Convolver(mask=mask, kernel=kernel)

    blurring_image = aa.Array2D.manual_mask(array=image.native,
                                            mask=blurring_mask)

    blurred_masked_im_1 = convolver.convolve_image(
        image=masked_image, blurring_image=blurring_image)

    assert blurred_masked_image_via_scipy == pytest.approx(
        blurred_masked_im_1, 1e-4)
def test__convolve_mapping_matrix__asymetric_convolver__matrix_blurred_correctly(
):

    mask = np.array([
        [True, True, True, True, True, True],
        [True, False, False, False, False, True],
        [True, False, False, False, False, True],
        [True, False, False, False, False, True],
        [True, False, False, False, False, True],
        [True, True, True, True, True, True],
    ])

    asymmetric_kernel = aa.Kernel2D.manual_native(array=[[0, 0.0, 0],
                                                         [0.4, 0.2, 0.3],
                                                         [0, 0.1, 0]],
                                                  pixel_scales=1.0)

    convolver = aa.Convolver(mask=mask, kernel=asymmetric_kernel)

    mapping = np.array([
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [
            0,
            1,
            0,
        ],  # The 0.3 should be 'chopped' from this pixel as it is on the right-most edge
        [0, 0, 0],
        [1, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
    ])

    blurred_mapping = convolver.convolve_mapping_matrix(mapping)

    assert (blurred_mapping == np.array([
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0.4, 0],
        [0, 0.2, 0],
        [0.4, 0, 0],
        [0.2, 0, 0.4],
        [0.3, 0, 0.2],
        [0, 0.1, 0.3],
        [0, 0, 0],
        [0.1, 0, 0],
        [0, 0, 0.1],
        [0, 0, 0],
    ])).all()

    asymmetric_kernel = aa.Kernel2D.manual_native(array=[[0, 0.0, 0],
                                                         [0.4, 0.2, 0.3],
                                                         [0, 0.1, 0]],
                                                  pixel_scales=1.0)

    convolver = aa.Convolver(mask=mask, kernel=asymmetric_kernel)

    mapping = np.array([
        [0, 1, 0],
        [0, 1, 0],
        [0, 1, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [
            0,
            1,
            0,
        ],  # The 0.3 should be 'chopped' from this pixel as it is on the right-most edge
        [1, 0, 0],
        [1, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
    ])

    blurred_mapping = convolver.convolve_mapping_matrix(mapping)

    assert blurred_mapping == pytest.approx(
        np.array([
            [0, 0.6, 0],
            [0, 0.9, 0],
            [0, 0.5, 0],
            [0, 0.3, 0],
            [0, 0.1, 0],
            [0, 0.1, 0],
            [0, 0.5, 0],
            [0, 0.2, 0],
            [0.6, 0, 0],
            [0.5, 0, 0.4],
            [0.3, 0, 0.2],
            [0, 0.1, 0.3],
            [0.1, 0, 0],
            [0.1, 0, 0],
            [0, 0, 0.1],
            [0, 0, 0],
        ]),
        1e-4,
    )
def test_image_frame_kernels__different_shape_masks(simple_mask_5x5,
                                                    simple_mask_2d_7x7):

    convolver = aa.Convolver(
        mask=simple_mask_5x5,
        kernel=aa.Kernel2D.manual_native(
            [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]],
            pixel_scales=1.0),
    )

    assert 9 == len(convolver.image_frame_1d_indexes)

    assert (convolver.image_frame_1d_kernels[4] == np.array(
        [[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]])).all()

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.manual_native(
            [
                [1.0, 2.0, 3.0, 4.0, 5.0],
                [6.0, 7.0, 8.0, 9.0, 10.0],
                [11.0, 12.0, 13.0, 14.0, 15.0],
            ],
            pixel_scales=1.0,
        ),
    )

    assert (convolver.image_frame_1d_kernels[0] == np.array(
        [8.0, 9.0, 10.0, 13.0, 14.0, 15.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[1] == np.array(
        [7.0, 8.0, 9.0, 12.0, 13.0, 14.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[2] == np.array(
        [6.0, 7.0, 8.0, 11.0, 12.0, 13.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[3] == np.array([
        3.0, 4.0, 5.0, 8.0, 9.0, 10.0, 13.0, 14.0, 15.0, -1, -1, -1, -1, -1, -1
    ])).all()
    assert (convolver.image_frame_1d_kernels[4] == np.array([
        2.0, 3.0, 4.0, 7.0, 8.0, 9.0, 12.0, 13.0, 14.0, -1, -1, -1, -1, -1, -1
    ])).all()
    assert (convolver.image_frame_1d_kernels[5] == np.array([
        1.0, 2.0, 3.0, 6.0, 7.0, 8.0, 11.0, 12.0, 13.0, -1, -1, -1, -1, -1, -1
    ])).all()
    assert (convolver.image_frame_1d_kernels[6] == np.array(
        [3.0, 4.0, 5.0, 8.0, 9.0, 10.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[7] == np.array(
        [2.0, 3.0, 4.0, 7.0, 8.0, 9.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[8] == np.array(
        [1.0, 2.0, 3.0, 6.0, 7.0, 8.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.manual_native(
            [
                [1.0, 2.0, 3.0],
                [4.0, 5.0, 6.0],
                [7.0, 8.0, 9.0],
                [10.0, 11.0, 12.0],
                [13.0, 14.0, 15.0],
            ],
            pixel_scales=1.0,
        ),
    )

    assert (convolver.image_frame_1d_kernels[0] == np.array(
        [8.0, 9.0, 11.0, 12.0, 14.0, 15.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[1] == np.array([
        7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, -1, -1, -1, -1, -1,
        -1
    ])).all()
    assert (convolver.image_frame_1d_kernels[2] == np.array(
        [7.0, 8.0, 10.0, 11.0, 13.0, 14.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[3] == np.array(
        [5.0, 6.0, 8.0, 9.0, 11.0, 12.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[4] == np.array([
        4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, -1, -1, -1, -1, -1, -1
    ])).all()
    assert (convolver.image_frame_1d_kernels[5] == np.array(
        [4.0, 5.0, 7.0, 8.0, 10.0, 11.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[6] == np.array(
        [2.0, 3.0, 5.0, 6.0, 8.0, 9.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[7] == np.array(
        [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, -1, -1, -1, -1, -1,
         -1])).all()
    assert (convolver.image_frame_1d_kernels[8] == np.array(
        [1.0, 2.0, 4.0, 5.0, 7.0, 8.0, -1, -1, -1, -1, -1, -1, -1, -1,
         -1])).all()
def test__image_frame_indexes__for_different_masks(cross_mask,
                                                   simple_mask_2d_7x7):

    convolver = aa.Convolver(
        mask=cross_mask,
        kernel=aa.Kernel2D.manual_native(
            [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]],
            pixel_scales=1.0),
    )

    assert 5 == len(convolver.image_frame_1d_indexes)

    assert (convolver.image_frame_1d_indexes[0] == np.array(
        [0, 1, 2, 3, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[1] == np.array(
        [0, 1, 2, 4, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[2] == np.array(
        [0, 1, 2, 3, 4, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[3] == np.array(
        [0, 2, 3, 4, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[4] == np.array(
        [1, 2, 3, 4, -1, -1, -1, -1, -1])).all()

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.ones(shape_native=(3, 5), pixel_scales=1.0),
    )

    assert (convolver.image_frame_1d_indexes[0] == np.array(
        [0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[1] == np.array(
        [0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[2] == np.array(
        [0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[3] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[4] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[5] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[6] == np.array(
        [3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[7] == np.array(
        [3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[8] == np.array(
        [3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.ones(shape_native=(5, 3), pixel_scales=1.0),
    )

    assert (convolver.image_frame_1d_indexes[0] == np.array(
        [0, 1, 3, 4, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[1] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[2] == np.array(
        [1, 2, 4, 5, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[3] == np.array(
        [0, 1, 3, 4, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[4] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[5] == np.array(
        [1, 2, 4, 5, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[6] == np.array(
        [0, 1, 3, 4, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[7] == np.array(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1])).all()
    assert (convolver.image_frame_1d_indexes[8] == np.array(
        [1, 2, 4, 5, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1])).all()

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.ones(shape_native=(5, 5), pixel_scales=1.0),
    )

    assert (convolver.image_frame_1d_indexes[0] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[1] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[2] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[3] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[4] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[5] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[6] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[7] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
    assert (convolver.image_frame_1d_indexes[8] == np.array([
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
        -1,
    ])).all()
def test__frame_extraction__more_complicated_frames(simple_mask_2d_7x7):

    convolver = aa.Convolver(
        mask=simple_mask_2d_7x7,
        kernel=aa.Kernel2D.manual_native(
            [
                [1.0, 2.0, 3.0, 4.0, 5.0],
                [6.0, 7.0, 8.0, 9.0, 10.0],
                [11.0, 12.0, 13.0, 14.0, 15.0],
                [16.0, 17.0, 18.0, 19.0, 20.0],
                [21.0, 22.0, 23.0, 24.0, 25.0],
            ],
            pixel_scales=1.0,
        ),
    )

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(2, 2),
        mask=simple_mask_2d_7x7,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (kernel_frame == np.array([
        13.0,
        14.0,
        15.0,
        18.0,
        19.0,
        20.0,
        23.0,
        24.0,
        25.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
    ])).all()

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(3, 2),
        mask=simple_mask_2d_7x7,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (kernel_frame == np.array([
        8.0,
        9.0,
        10.0,
        13.0,
        14.0,
        15.0,
        18.0,
        19.0,
        20.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1,
    ])).all()

    frame, kernel_frame = convolver.frame_at_coordinates_jit(
        coordinates=(3, 3),
        mask=simple_mask_2d_7x7,
        mask_index_array=convolver.mask_index_array,
        kernel_2d=convolver.kernel.native,
    )

    assert (kernel_frame == np.array([
        7.0,
        8.0,
        9.0,
        12.0,
        13.0,
        14.0,
        17.0,
        18.0,
        19.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1.0,
        -1,
    ])).all()