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.
code: def __init__(self, factor=1.2, volatility=0.0001):
      self.factor = factor
      self.volatility = volatility
  
imports: import numpy
  from orion.core.utils import GenericFactory
  from orion.core.utils.flatten import flatten, unflatten
label_desc: Use image node_id 1 to create a new PerturbExplore object from inherited base classes: BaseExplore with example: obj = PerturbExplore(factor, volatility)