def __call__(
        self, x: np.ndarray, column_pos: int | list | None = None, row_pos: int | list | None = None
    ) -> np.ndarray:
        """
        Performs ablation on the input x. If no row_pos/column_pos is specified a random location will be selected.

        :param x: input data
        :param column_pos: Specifies the column index to retain the image block. Either an int to apply the same
                   position to all images in a batch, or a list of ints to apply a different
                   column position per datapoint.
        :param row_pos: Specifies the row index to retain the image block. Either an int to apply the same position to
                        all images in a batch, or a list of ints to apply a different row position per datapoint.
        :return: Data ablated at all locations aside from the specified block. Data is channel extended to indicate to a
                 model if a position is ablated.
        """
        return self.forward(x=x, row_pos=row_pos, column_pos=column_pos)

        Performs ablation on the input x. If no row_pos/column_pos is specified a random location will be selected.

        :param x: input data
        :param column_pos: Specifies the column index to retain the image block. Either an int to apply the same
                   position to all images in a batch, or a list of ints to apply a different
                   column position per datapoint.
        :param row_pos: Specifies the row index to retain the image block. Either an int to apply the same position to
                        all images in a batch, or a list of ints to apply a different row position per datapoint.
        :return: Data ablated at all locations aside from the specified block. Data is channel extended to indicate to a
                 model if a position is ablated.
        
art/estimators/certification/derandomized_smoothing/ablators/tensorflow.py