Source code for autoarray.inversion.regularization.constant_split

from __future__ import annotations
import numpy as np
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from autoarray.inversion.linear_obj.linear_obj import LinearObj

from autoarray.inversion.regularization.constant import Constant

from autoarray.inversion.regularization import regularization_util


[docs]class ConstantSplit(Constant): def __init__(self, coefficient: float = 1.0): """ Regularization which uses the derivatives at a cross of four points around each pixel centre and a single value to smooth an inversion's solution. The size of this cross is determined via the size of the source-pixel, for example if the source pixel is a Voronoi pixel the area of the pixel is computed and the distance of each point of the cross is given by the area times 0.5. For this regularization scheme, there is only 1 regularization coefficient that is applied to all neighboring pixels. This means that the matrix B only needs to regularize pixels in one direction (e.g. pixel 0 regularizes pixel 1, but NOT visa versa). For example: B = [-1, 1] [0->1] [0, -1] 1 does not regularization with 0 Note that for this scheme the indexes of entries in the regularization matrix are not the source pixel indexes but the indexes of each source pixel index cross. A small numerical value of 1.0e-8 is added to all elements in constant regularization matrix, to ensure that it is positive definite. A full description of regularization and this matrix can be found in the parent `AbstractRegularization` class. Parameters ---------- coefficient The regularization coefficient which controls the degree of smooth of the inversion reconstruction. """ super().__init__(coefficient=coefficient)
[docs] def regularization_matrix_from(self, linear_obj: LinearObj) -> np.ndarray: """ Returns the regularization matrix with shape [pixels, pixels]. Parameters ---------- linear_obj The linear object (e.g. a ``Mapper``) which uses this matrix to perform regularization. Returns ------- The regularization matrix. """ pix_sub_weights_split_cross = linear_obj.pix_sub_weights_split_cross ( splitted_mappings, splitted_sizes, splitted_weights, ) = regularization_util.reg_split_from( splitted_mappings=pix_sub_weights_split_cross.mappings, splitted_sizes=pix_sub_weights_split_cross.sizes, splitted_weights=pix_sub_weights_split_cross.weights, ) pixels = int(len(splitted_mappings) / 4) regularization_weights = np.full(fill_value=self.coefficient, shape=(pixels,)) return regularization_util.pixel_splitted_regularization_matrix_from( regularization_weights=regularization_weights, splitted_mappings=splitted_mappings, splitted_sizes=splitted_sizes, splitted_weights=splitted_weights, )