class_docstr: Perturb parameters for exploration
  
  Given a set of parameter values, this exploration object randomly perturb
  them with a given ``factor``. It will multiply the value of a dimension
  with probability 0.5, otherwise divide it. Values are clamped to limits of the
  search space when exceeding it. For categorical dimensions, a new value is sampled
  from categories with equal probability for each categories.
  
  Parameters
  ----------
  factor: float, optional
      Factor used to multiply or divide with probability 0.5 the values of the dimensions.
      Only applies to real or int dimensions. Integer dimensions are pushed to next integer
      if ``new_value > value`` otherwise reduced to previous integer, where new_value is
      the result of either ``value * factor`` or ``value / factor``.
      Categorial dimensions are sampled from categories randomly. Default: 1.2
  volatility: float, optional
      If the results of ``value * factor`` or ``value / factor`` exceeds the
      limit of the search space, the new value is set to limit and then added
      or subtracted ``abs(normal(0, volatility))`` (if at lower limit or upper limit).
      Default: 0.0001
  
  Notes
  -----
  Categorical dimensions with special probabilities are not supported for now. A category
  with be sampled with equal probability for each categories.
docstr: Perturb integer value dimension
  
  Parameters
  ----------
  rng: numpy.random.Generator
      Random number generator
  dim_value: int
      Value of the dimension
  interval: tuple of int
      Limit of the dimension (lower, upper)
docstr_tok: ["Perturb","integer","value","dimension","Parameters","--","--","--","--","--","rng",":","numpy.random.Generator","Random","number","generator","dim_value",":","int","Value","of","the","dimension","interval",":","tuple","of","int","Limit","of","the","dimension","(","lower",",","upper",")"]
code: def perturb_int(self, rng, dim_value, interval):
      """Perturb integer value dimension
  
      Parameters
      ----------
      rng: numpy.random.Generator
          Random number generator
      dim_value: int
          Value of the dimension
      interval: tuple of int
          Limit of the dimension (lower, upper)
  
      """
  
      new_dim_value = self.perturb_real(rng, dim_value, interval)
  
      rounded_new_dim_value = int(numpy.round(new_dim_value))
  
      if (
          rounded_new_dim_value == dim_value
          and new_dim_value > dim_value
      ):
          new_dim_value = dim_value + 1
      elif (
          rounded_new_dim_value == dim_value
          and new_dim_value < dim_value
      ):
          new_dim_value = dim_value - 1
      else:
          new_dim_value = rounded_new_dim_value
  
      # Avoid out of dimension.
      new_dim_value = min(max(new_dim_value, interval[0]), interval[1])
  
      return new_dim_value
  
imports: import numpy
  from orion.core.utils import GenericFactory
  from orion.core.utils.flatten import flatten, unflatten
label_desc: Use image node_id 3 for calling the PerturbExplore obj's underlying member method code with example usage: obj.perturb_int(rng, dim_value, interval) and returns: new_dim_value