diff --git a/GPy/core/parameterization/parameter_core.py b/GPy/core/parameterization/parameter_core.py index 0ecc1ebf..4edb0520 100644 --- a/GPy/core/parameterization/parameter_core.py +++ b/GPy/core/parameterization/parameter_core.py @@ -954,19 +954,30 @@ class Parameterizable(OptimizationHandlable): if ignore_added_names: self.__dict__[pname] = param return + + def warn_and_retry(): + print """ + WARNING: added a parameter with formatted name {}, + which is already assigned to {}. + Trying to change the parameter name to + + {}.{} + """.format(pname, self.hierarchy_name(), self.hierarchy_name(), param.name + "_") + param.name += "_" + self._add_parameter_name(param, ignore_added_names) # and makes sure to not delete programmatically added parameters if pname in self.__dict__: if not (param is self.__dict__[pname]): if pname in self._added_names_: del self.__dict__[pname] self._add_parameter_name(param) + else: + warn_and_retry() elif pname not in dir(self): self.__dict__[pname] = param self._added_names_.add(pname) else: - print "WARNING: added a parameter with formatted name {}, which is already a member of {} object. Trying to change the parameter name to\n {}".format(pname, self.__class__, param.name + "_") - param.name += "_" - self._add_parameter_name(param, ignore_added_names) + warn_and_retry() def _remove_parameter_name(self, param=None, pname=None): assert param is None or pname is None, "can only delete either param by name, or the name of a param" diff --git a/GPy/core/parameterization/parameterized.py b/GPy/core/parameterization/parameterized.py index eabd5a9c..e036d680 100644 --- a/GPy/core/parameterization/parameterized.py +++ b/GPy/core/parameterization/parameterized.py @@ -180,7 +180,10 @@ class Parameterized(Parameterizable): :param param: param object to remove from being a parameter of this parameterized object. """ if not param in self.parameters: - raise RuntimeError, "Parameter {} does not belong to this object {}, remove parameters directly from their respective parents".format(param._short(), self.name) + try: + raise RuntimeError, "{} does not belong to this object {}, remove parameters directly from their respective parents".format(param._short(), self.name) + except AttributeError: + raise RuntimeError, "{} does not seem to be a parameter, remove parameters directly from their respective parents".format(str(param)) start = sum([p.size for p in self.parameters[:param._parent_index_]]) self._remove_parameter_name(param) diff --git a/GPy/core/parameterization/variational.py b/GPy/core/parameterization/variational.py index cf8d3067..9e0127a2 100644 --- a/GPy/core/parameterization/variational.py +++ b/GPy/core/parameterization/variational.py @@ -111,7 +111,7 @@ class VariationalPosterior(Parameterized): n.input_dim = n.mean.shape[1] if n.ndim != 1 else 1 return n else: - return super(VariationalPrior, self).__getitem__(s) + return super(VariationalPosterior, self).__getitem__(s) class NormalPosterior(VariationalPosterior): '''