code: def add_hparam(self, name, value):
      
      # Keys in kwargs are unique, but 'name' could the name of a pre-existing
      # attribute of this object.  In that case we refuse to use it as a
      # hyperparameter name.
      if getattr(self, name, None) is not None:
        raise ValueError('Hyperparameter name is reserved: %s' % name)
      if isinstance(value, (list, tuple)):
        if not value:
          raise ValueError(
              'Multi-valued hyperparameters cannot be empty: %s' % name)
        self._hparam_types[name] = (type(value[0]), True)
      else:
        self._hparam_types[name] = (type(value), False)
      setattr(self, name, value)
docs: Adds {name, value} pair to hyperparameters.
  
      Args:
        name: Name of the hyperparameter.
        value: Value of the hyperparameter. Can be one of the following types:
          int, float, string, int list, float list, or string list.
  
      Raises:
        ValueError: if one of the arguments is invalid.