mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-09 12:02:38 +02:00
Fixed parameterized oddity where it was updating all constrained parameters as soon as any were constrained rather than after all are constrained@
@
This commit is contained in:
parent
1c9151a7d0
commit
b12fb6a2a8
3 changed files with 87 additions and 69 deletions
|
|
@ -493,7 +493,7 @@ class ParamConcatenation(object):
|
||||||
ind = numpy.zeros(sum(self._param_sizes), dtype=bool); ind[s] = True;
|
ind = numpy.zeros(sum(self._param_sizes), dtype=bool); ind[s] = True;
|
||||||
vals = self._vals(); vals[s] = val; del val
|
vals = self._vals(); vals[s] = val; del val
|
||||||
[numpy.place(p, ind[ps], vals[ps]) and p._notify_tied_parameters()
|
[numpy.place(p, ind[ps], vals[ps]) and p._notify_tied_parameters()
|
||||||
for p, ps in zip(self.params, self._param_slices_)]
|
for p, ps in zip(self.params, self._param_slices_)]
|
||||||
if update:
|
if update:
|
||||||
self.params[0]._highest_parent_.parameters_changed()
|
self.params[0]._highest_parent_.parameters_changed()
|
||||||
def _vals(self):
|
def _vals(self):
|
||||||
|
|
@ -501,38 +501,55 @@ class ParamConcatenation(object):
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# parameter operations:
|
# parameter operations:
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
|
def update_all_params(self):
|
||||||
|
self.params[0]._highest_parent_.parameters_changed()
|
||||||
|
|
||||||
def constrain(self, constraint, warning=True):
|
def constrain(self, constraint, warning=True):
|
||||||
[param.constrain(constraint) for param in self.params]
|
[param.constrain(constraint, update=False) for param in self.params]
|
||||||
|
self.update_all_params()
|
||||||
constrain.__doc__ = Param.constrain.__doc__
|
constrain.__doc__ = Param.constrain.__doc__
|
||||||
|
|
||||||
def constrain_positive(self, warning=True):
|
def constrain_positive(self, warning=True):
|
||||||
[param.constrain_positive(warning) for param in self.params]
|
[param.constrain_positive(warning, update=False) for param in self.params]
|
||||||
|
self.update_all_params()
|
||||||
constrain_positive.__doc__ = Param.constrain_positive.__doc__
|
constrain_positive.__doc__ = Param.constrain_positive.__doc__
|
||||||
|
|
||||||
def constrain_fixed(self, warning=True):
|
def constrain_fixed(self, warning=True):
|
||||||
[param.constrain_fixed(warning) for param in self.params]
|
[param.constrain_fixed(warning) for param in self.params]
|
||||||
constrain_fixed.__doc__ = Param.constrain_fixed.__doc__
|
constrain_fixed.__doc__ = Param.constrain_fixed.__doc__
|
||||||
fix = constrain_fixed
|
fix = constrain_fixed
|
||||||
|
|
||||||
def constrain_negative(self, warning=True):
|
def constrain_negative(self, warning=True):
|
||||||
[param.constrain_negative(warning) for param in self.params]
|
[param.constrain_negative(warning, update=False) for param in self.params]
|
||||||
|
self.update_all_params()
|
||||||
constrain_negative.__doc__ = Param.constrain_negative.__doc__
|
constrain_negative.__doc__ = Param.constrain_negative.__doc__
|
||||||
|
|
||||||
def constrain_bounded(self, lower, upper, warning=True):
|
def constrain_bounded(self, lower, upper, warning=True):
|
||||||
[param.constrain_bounded(lower, upper, warning) for param in self.params]
|
[param.constrain_bounded(lower, upper, warning, update=False) for param in self.params]
|
||||||
|
self.update_all_params()
|
||||||
constrain_bounded.__doc__ = Param.constrain_bounded.__doc__
|
constrain_bounded.__doc__ = Param.constrain_bounded.__doc__
|
||||||
|
|
||||||
def unconstrain(self, *constraints):
|
def unconstrain(self, *constraints):
|
||||||
[param.unconstrain(*constraints) for param in self.params]
|
[param.unconstrain(*constraints) for param in self.params]
|
||||||
unconstrain.__doc__ = Param.unconstrain.__doc__
|
unconstrain.__doc__ = Param.unconstrain.__doc__
|
||||||
|
|
||||||
def unconstrain_negative(self):
|
def unconstrain_negative(self):
|
||||||
[param.unconstrain_negative() for param in self.params]
|
[param.unconstrain_negative() for param in self.params]
|
||||||
unconstrain_negative.__doc__ = Param.unconstrain_negative.__doc__
|
unconstrain_negative.__doc__ = Param.unconstrain_negative.__doc__
|
||||||
|
|
||||||
def unconstrain_positive(self):
|
def unconstrain_positive(self):
|
||||||
[param.unconstrain_positive() for param in self.params]
|
[param.unconstrain_positive() for param in self.params]
|
||||||
unconstrain_positive.__doc__ = Param.unconstrain_positive.__doc__
|
unconstrain_positive.__doc__ = Param.unconstrain_positive.__doc__
|
||||||
|
|
||||||
def unconstrain_fixed(self):
|
def unconstrain_fixed(self):
|
||||||
[param.unconstrain_fixed() for param in self.params]
|
[param.unconstrain_fixed() for param in self.params]
|
||||||
unconstrain_fixed.__doc__ = Param.unconstrain_fixed.__doc__
|
unconstrain_fixed.__doc__ = Param.unconstrain_fixed.__doc__
|
||||||
unfix = unconstrain_fixed
|
unfix = unconstrain_fixed
|
||||||
|
|
||||||
def unconstrain_bounded(self, lower, upper):
|
def unconstrain_bounded(self, lower, upper):
|
||||||
[param.unconstrain_bounded(lower, upper) for param in self.params]
|
[param.unconstrain_bounded(lower, upper) for param in self.params]
|
||||||
unconstrain_bounded.__doc__ = Param.unconstrain_bounded.__doc__
|
unconstrain_bounded.__doc__ = Param.unconstrain_bounded.__doc__
|
||||||
|
|
||||||
def untie(self, *ties):
|
def untie(self, *ties):
|
||||||
[param.untie(*ties) for param in self.params]
|
[param.untie(*ties) for param in self.params]
|
||||||
__lt__ = lambda self, val: self._vals()<val
|
__lt__ = lambda self, val: self._vals()<val
|
||||||
|
|
|
||||||
|
|
@ -98,30 +98,30 @@ class Constrainable(Nameable):
|
||||||
if update:
|
if update:
|
||||||
self.parameters_changed()
|
self.parameters_changed()
|
||||||
|
|
||||||
def constrain_positive(self, warning=True):
|
def constrain_positive(self, warning=True, update=True):
|
||||||
"""
|
"""
|
||||||
:param warning: print a warning if re-constraining parameters.
|
:param warning: print a warning if re-constraining parameters.
|
||||||
|
|
||||||
Constrain this parameter to the default positive constraint.
|
Constrain this parameter to the default positive constraint.
|
||||||
"""
|
"""
|
||||||
self.constrain(Logexp(), warning)
|
self.constrain(Logexp(), warning=warning, update=update)
|
||||||
|
|
||||||
def constrain_negative(self, warning=True):
|
def constrain_negative(self, warning=True, update=True):
|
||||||
"""
|
"""
|
||||||
:param warning: print a warning if re-constraining parameters.
|
:param warning: print a warning if re-constraining parameters.
|
||||||
|
|
||||||
Constrain this parameter to the default negative constraint.
|
Constrain this parameter to the default negative constraint.
|
||||||
"""
|
"""
|
||||||
self.constrain(NegativeLogexp(), warning)
|
self.constrain(NegativeLogexp(), warning=warning, update=update)
|
||||||
|
|
||||||
def constrain_bounded(self, lower, upper, warning=True):
|
def constrain_bounded(self, lower, upper, warning=True, update=True):
|
||||||
"""
|
"""
|
||||||
:param lower, upper: the limits to bound this parameter to
|
:param lower, upper: the limits to bound this parameter to
|
||||||
:param warning: print a warning if re-constraining parameters.
|
:param warning: print a warning if re-constraining parameters.
|
||||||
|
|
||||||
Constrain this parameter to lie within the given range.
|
Constrain this parameter to lie within the given range.
|
||||||
"""
|
"""
|
||||||
self.constrain(Logistic(lower, upper), warning)
|
self.constrain(Logistic(lower, upper), warning=warning, update=update)
|
||||||
|
|
||||||
def unconstrain(self, *transforms):
|
def unconstrain(self, *transforms):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -413,10 +413,10 @@ class Parameterized(Constrainable, Pickleable, Observable):
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# Fixing parameters:
|
# Fixing parameters:
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
def _fix(self, param, warning=True):
|
def _fix(self, param, warning=True, update=True):
|
||||||
f = self._add_constrain(param, __fixed__, warning)
|
f = self._add_constrain(param, __fixed__, warning)
|
||||||
self._set_fixed(f)
|
self._set_fixed(f)
|
||||||
def _unfix(self, param):
|
def _unfix(self, param, update=True):
|
||||||
if self._has_fixes():
|
if self._has_fixes():
|
||||||
f = self._remove_constrain(param, __fixed__)
|
f = self._remove_constrain(param, __fixed__)
|
||||||
self._set_unfixed(f)
|
self._set_unfixed(f)
|
||||||
|
|
@ -438,7 +438,8 @@ class Parameterized(Constrainable, Pickleable, Observable):
|
||||||
# if advanced indexing is activated it happens that the array is a copy
|
# if advanced indexing is activated it happens that the array is a copy
|
||||||
# you can retrieve the original param through this method, by passing
|
# you can retrieve the original param through this method, by passing
|
||||||
# the copy here
|
# the copy here
|
||||||
return self._parameters_[param._parent_index_]
|
#return self._parameters_[param._parent_index_]
|
||||||
|
return param._direct_parent_._parameters_[param._parent_index_]
|
||||||
def hirarchy_name(self):
|
def hirarchy_name(self):
|
||||||
if self.has_parent():
|
if self.has_parent():
|
||||||
return self._direct_parent_.hirarchy_name() + adjust_name_for_printing(self.name) + "."
|
return self._direct_parent_.hirarchy_name() + adjust_name_for_printing(self.name) + "."
|
||||||
|
|
@ -452,7 +453,7 @@ class Parameterized(Constrainable, Pickleable, Observable):
|
||||||
# if removing constraints before adding new is not wanted, just delete the above line!
|
# if removing constraints before adding new is not wanted, just delete the above line!
|
||||||
self.constraints.add(transform, rav_i)
|
self.constraints.add(transform, rav_i)
|
||||||
param = self._get_original(param)
|
param = self._get_original(param)
|
||||||
param._set_params(transform.initialize(param._get_params()))
|
param._set_params(transform.initialize(param._get_params()), update=False)
|
||||||
if warning and any(reconstrained):
|
if warning and any(reconstrained):
|
||||||
# if you want to print the whole params object, which was reconstrained use:
|
# if you want to print the whole params object, which was reconstrained use:
|
||||||
# m = str(param[self._backtranslate_index(param, reconstrained)])
|
# m = str(param[self._backtranslate_index(param, reconstrained)])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue