def forward(
        self, cent: np.ndarray, eps: np.ndarray | None = None
    ) -> "torch.Tensor" | tuple["torch.Tensor", "torch.Tensor"]:
        """
        Performs the neural network forward pass, either using abstract operations or concrete ones
        depending on the value of self.forward_mode

        :param cent: input data, either regular data if running in concrete mode, or the zonotope bias term.
        :param eps: zonotope error terms if running in abstract mode
        :return: model predictions, with zonotope error terms if running in abstract mode
        """
        if self.forward_mode == "concrete":
            return self.concrete_forward(cent)
        if self.forward_mode == "abstract":
            if eps is not None:
                out_cent, out_eps = self.abstract_forward(cent, eps)
                return out_cent, out_eps
            raise ValueError("for abstract forward mode, please provide both cent and eps")
        raise ValueError("forward_mode must be set to abstract or concrete")

        Performs the neural network forward pass, either using abstract operations or concrete ones
        depending on the value of self.forward_mode

        :param cent: input data, either regular data if running in concrete mode, or the zonotope bias term.
        :param eps: zonotope error terms if running in abstract mode
        :return: model predictions, with zonotope error terms if running in abstract mode
        
art/estimators/certification/deep_z/pytorch.py