class_docstr: Implements a discrete ANM. This is, it follows a normal ANM of the form Y = f(X) + N, where N is assumed to be
  independent of X and f is forced to output discrete values. To allow for flexible models, f can be any regression
  model and the output will be rounded to a discrete value accordingly. Note that this remains a valid additive noise
  model, but assumes that Y can take any integer value.
class_docstr_tok: ["Implements","a","discrete","ANM",".","This","is",",","it","follows","a","normal","ANM","of","the","form","Y","=","f","(","X",")","+","N",",","where","N","is","assumed","to","be","independent","of","X","and","f","is","forced","to","output","discrete","values",".","To","allow","for","flexible","models",",","f","can","be","any","regression","model","and","the","output","will","be","rounded","to","a","discrete","value","accordingly",".","Note","that","this","remains","a","valid","additive","noise","model",",","but","assumes","that","Y","can","take","any","integer","value","."]
code: def _rounded_prediction(self, X: np.ndarray) -> np.ndarray:
      return np.round(
          self._prediction_model.predict(X).astype(float)
      ).astype(np.int32)
  
imports: import copy
  from abc import ABC, abstractmethod
  from typing import List, Optional
  import numpy
  from dowhy.gcm.ml import ClassificationModel, PredictionModel
  from dowhy.gcm.ml.regression import InvertibleFunction, SklearnRegressionModel
  from dowhy.gcm.util.general import is_categorical, is_discrete, shape_into_2d
label_desc: Use image node_id 4 for calling the DiscreteAdditiveNoiseModel obj's underlying member method code with example usage: obj._rounded_prediction(X) and returns: np