diff --git a/GPy/core/parameterization/parameter_core.py b/GPy/core/parameterization/parameter_core.py index 6be83db2..2096c55a 100644 --- a/GPy/core/parameterization/parameter_core.py +++ b/GPy/core/parameterization/parameter_core.py @@ -515,19 +515,12 @@ class Indexable(Nameable, Observable): #=========================================================================== # Tie parameters together #=========================================================================== - - def _has_ties(self): - if self._highest_parent_.ties.tied_param is None: - return False - if self.has_parent(): - return self._highest_parent_.ties.label_buf[self._highest_parent_._raveled_index_for(self)].sum()>0 - return True - + def tie_together(self, *plist): plist = list(plist) plist.append(self) self._highest_parent_.ties.tie_together(plist) - self._highest_parent_._set_fixed(self,self._raveled_index()) +# self._highest_parent_._set_fixed(self,self._raveled_index()) self._trigger_params_changed() #=========================================================================== @@ -683,9 +676,10 @@ class OptimizationHandlable(Indexable): if self.has_parent() and (self.constraints[__fixed__].size != 0 or self._has_ties()): fixes = np.ones(self.size).astype(bool) fixes[self.constraints[__fixed__]] = FIXED - return self._optimizer_copy_[np.logical_and(fixes, self._highest_parent_.ties.getTieFlag(self))] + fixes[self._highest_parent_.ties.label_buf[self._highest_parent_._raveled_index_for(self)]] = FIXED + return self._optimizer_copy_[fixes] elif self._has_fixes(): - return self._optimizer_copy_[self._fixes_] + return self._optimizer_copy_[np.logical_and(self._fixes_,self.ties.label_buf==0)] self._optimizer_copy_transformed = True diff --git a/GPy/core/parameterization/ties_and_remappings.py b/GPy/core/parameterization/ties_and_remappings.py index 2c1984d9..f567fab2 100644 --- a/GPy/core/parameterization/ties_and_remappings.py +++ b/GPy/core/parameterization/ties_and_remappings.py @@ -55,7 +55,7 @@ class Tie(Parameterized): TODO: 1. Add the support for multiple parameter tie_together and tie_vector 2. Properly handling parameters with constraints - 3. Properly handling the merging of two models + 3. Properly handling the merging of two models [DONE] 4. Properly handling initialization """ @@ -64,7 +64,6 @@ class Tie(Parameterized): # If ture, it does not need to check consistency self._PROPAGATE_VAL_ = False super(Tie, self).__init__(name) - self.size = sum(p.size for p in self.parameters) self.tied_param = None # The buffer keeps track of tie status self.label_buf = None @@ -146,7 +145,6 @@ class Tie(Parameterized): self.tied_param.tie[:old_size] = old_tie_ self.tied_param.tie[old_size:] = range(start_label,start_label+num) self.add_parameter(self.tied_param) - self.size = sum(p.size for p in self.parameters) return range(start_label,start_label+num) def _remove_tie_param(self, labels): @@ -163,7 +161,6 @@ class Tie(Parameterized): self.tied_param = Param('tied',new_buf) self.tied_param.tie[:] = old_tie_[idx] self.add_parameter(self.tied_param) - self.size = sum(p.size for p in self.parameters) def _merge_tie_labels(self, labels): """Merge all the labels in the list to the first one""" @@ -177,7 +174,7 @@ class Tie(Parameterized): self.label_buf = None self.buf_idx = None else: - self.label_buf = np.zeros((self._highest_parent_.size,),dtype=np.uint32) + self.label_buf = np.zeros((self._highest_parent_.param_array.size,),dtype=np.uint32) self._traverse_param(lambda x:np.put(self.label_buf,self._highest_parent_._raveled_index_for(x),x.tie), self._highest_parent_, []) self.buf_idx = self._highest_parent_._raveled_index_for(self.tied_param) diff --git a/GPy/kern/_src/psi_comp/__init__.py b/GPy/kern/_src/psi_comp/__init__.py index 7a5851fb..c421afd8 100644 --- a/GPy/kern/_src/psi_comp/__init__.py +++ b/GPy/kern/_src/psi_comp/__init__.py @@ -28,6 +28,9 @@ class PSICOMP_RBF(Pickleable): return ssrbf_psi_comp.psiDerivativecomputations(dL_dpsi0, dL_dpsi1, dL_dpsi2, variance, lengthscale, Z, variational_posterior) else: raise ValueError, "unknown distriubtion received for psi-statistics" + + def _setup_observers(self): + pass class PSICOMP_Linear(Pickleable):