def abstract_forward(
        self, cent: np.ndarray, eps: np.ndarray
    ) -> tuple["torch.Tensor", "torch.Tensor"]:  # typing: ignore
        """
        Do the forward pass through the NN with the given error terms and zonotope center.

        :param cent: The datapoint, representing the zonotope center.
        :param eps: Error terms of the zonotope.
        :return: A tuple, the first element being the zonotope center vector.
                 The second is the zonotope error terms/coefficients.
        """

        x = np.concatenate([cent, eps])
        x = torch.from_numpy(x.astype("float32")).to(self.device)

        for op_num, op in enumerate(self.ops):
            # as reshapes are not modules we infer when the reshape from convolutional to dense occurs
            if self.reshape_op_num == op_num:
                x = x.reshape((x.shape[0], -1))
            x = op(x)
        return x[0, :], x[1:, :]

        Do the forward pass through the NN with the given error terms and zonotope center.

        :param cent: The datapoint, representing the zonotope center.
        :param eps: Error terms of the zonotope.
        :return: A tuple, the first element being the zonotope center vector.
                 The second is the zonotope error terms/coefficients.
        
art/estimators/certification/deep_z/pytorch.py