code: def explore(config, mutations, resample_probability, custom_explore_fn):
      
      new_config = copy.deepcopy(config)
      for key, distribution in mutations.items():
          if isinstance(distribution, dict):
              new_config.update({
                  key: explore(config[key], mutations[key], resample_probability,
                               None)
              })
          elif isinstance(distribution, list):
              if random.random() < resample_probability or \
                      config[key] not in distribution:
                  new_config[key] = random.choice(distribution)
              elif random.random() > 0.5:
                  new_config[key] = distribution[max(
                      0,
                      distribution.index(config[key]) - 1)]
              else:
                  new_config[key] = distribution[min(
                      len(distribution) - 1,
                      distribution.index(config[key]) + 1)]
          else:
              if random.random() < resample_probability:
                  new_config[key] = distribution()
              elif random.random() > 0.5:
                  new_config[key] = config[key] * 1.2
              else:
                  new_config[key] = config[key] * 0.8
              if type(config[key]) is int:
                  new_config[key] = int(new_config[key])
      if custom_explore_fn:
          new_config = custom_explore_fn(new_config)
          assert new_config is not None, \
              "Custom explore fn failed to return new config"
      logger.info("[explore] perturbed config from {} -> {}".format(
          config, new_config))
      return new_config
docs: Return a config perturbed as specified.
  
      Args:
          config (dict): Original hyperparameter configuration.
          mutations (dict): Specification of mutations to perform as documented
              in the PopulationBasedTraining scheduler.
          resample_probability (float): Probability of allowing resampling of a
              particular variable.
          custom_explore_fn (func): Custom explore fn applied after built-in
              config perturbations are.