code: def suggest_charges(self, tolerance=0.1):
          
          recommendations = {}
  
          for def_type in self.defect_types:
              test_charges = np.arange(
                  np.min(self.stable_charges[def_type]) - 1,
                  np.max(self.stable_charges[def_type]) + 2)
              test_charges = [charge for charge in test_charges if charge not in self.finished_charges[def_type]]
  
              if len(self.transition_level_map[def_type].keys()):
                  # More positive charges will shift the minimum transition level down
                  # Max charge is limited by this if its transition level is close to VBM
                  min_tl = min(self.transition_level_map[def_type].keys())
                  if min_tl < tolerance:
                      max_charge = max(self.transition_level_map[def_type][min_tl])
                      test_charges = [charge for charge in test_charges if charge < max_charge]
  
                  # More negative charges will shift the maximum transition level up
                  # Minimum charge is limited by this if transition level is near CBM
                  max_tl = max(self.transition_level_map[def_type].keys())
                  if max_tl > (self.band_gap - tolerance):
                      min_charge = min(self.transition_level_map[def_type][max_tl])
                      test_charges = [charge for charge in test_charges if charge > min_charge]
              else:
                  test_charges = [charge for charge in test_charges if charge not in self.stable_charges[def_type]]
  
              recommendations[def_type] = test_charges
  
          return recommendations
docs: Suggest possible charges for defects to computee based on proximity
          of known transitions from entires to VBM and CBM
  
          Args:
              tolerance (float): tolerance with respect to the VBM and CBM to
                      `          continue to compute new charges