mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-21 14:05:14 +02:00
Merge branch 'params' of https://github.com/SheffieldML/GPy into params
This commit is contained in:
commit
d2c4c10573
9 changed files with 149 additions and 143 deletions
|
|
@ -31,7 +31,7 @@ class GP(Model):
|
||||||
super(GP, self).__init__(name)
|
super(GP, self).__init__(name)
|
||||||
|
|
||||||
assert X.ndim == 2
|
assert X.ndim == 2
|
||||||
if isinstance(X, ObservableArray) or isinstance(X, VariationalPosterior):
|
if isinstance(X, (ObservableArray, VariationalPosterior)):
|
||||||
self.X = X
|
self.X = X
|
||||||
else: self.X = ObservableArray(X)
|
else: self.X = ObservableArray(X)
|
||||||
|
|
||||||
|
|
@ -224,13 +224,9 @@ class GP(Model):
|
||||||
self.kern,
|
self.kern,
|
||||||
self.likelihood,
|
self.likelihood,
|
||||||
self.output_dim,
|
self.output_dim,
|
||||||
self._Xoffset,
|
|
||||||
self._Xscale,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def _setstate(self, state):
|
def _setstate(self, state):
|
||||||
self._Xscale = state.pop()
|
|
||||||
self._Xoffset = state.pop()
|
|
||||||
self.output_dim = state.pop()
|
self.output_dim = state.pop()
|
||||||
self.likelihood = state.pop()
|
self.likelihood = state.pop()
|
||||||
self.kern = state.pop()
|
self.kern = state.pop()
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,8 @@ class Param(OptimizationHandlable, ObservableArray, Gradcheckable):
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
@property
|
@property
|
||||||
def _description_str(self):
|
def _description_str(self):
|
||||||
if self.size <= 1: return ["%f" % self]
|
if self.size <= 1:
|
||||||
|
return [str(numpy.take(self, 0))]
|
||||||
else: return [str(self.shape)]
|
else: return [str(self.shape)]
|
||||||
def parameter_names(self, add_self=False, adjust_for_printing=False):
|
def parameter_names(self, add_self=False, adjust_for_printing=False):
|
||||||
if adjust_for_printing:
|
if adjust_for_printing:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
# Licensed under the BSD 3-clause license (see LICENSE.txt)
|
# Licensed under the BSD 3-clause license (see LICENSE.txt)
|
||||||
|
|
||||||
from transformations import Transformation, Logexp, NegativeLogexp, Logistic, __fixed__, FIXED, UNFIXED
|
from transformations import Transformation, Logexp, NegativeLogexp, Logistic, __fixed__, FIXED, UNFIXED
|
||||||
import heapq
|
import numpy as np
|
||||||
|
|
||||||
__updated__ = '2013-12-16'
|
__updated__ = '2013-12-16'
|
||||||
|
|
||||||
|
|
@ -22,7 +22,7 @@ class Observable(object):
|
||||||
self._observer_callables_ = []
|
self._observer_callables_ = []
|
||||||
|
|
||||||
def add_observer(self, observer, callble, priority=0):
|
def add_observer(self, observer, callble, priority=0):
|
||||||
heapq.heappush(self._observer_callables_, (priority, observer, callble))
|
self._insert_sorted(priority, observer, callble)
|
||||||
|
|
||||||
def remove_observer(self, observer, callble=None):
|
def remove_observer(self, observer, callble=None):
|
||||||
to_remove = []
|
to_remove = []
|
||||||
|
|
@ -51,10 +51,21 @@ class Observable(object):
|
||||||
if which is None:
|
if which is None:
|
||||||
which = self
|
which = self
|
||||||
if min_priority is None:
|
if min_priority is None:
|
||||||
[callble(which) for _, _, callble in heapq.nlargest(len(self._observer_callables_), self._observer_callables_)]
|
[callble(which) for _, _, callble in self._observer_callables_]
|
||||||
else:
|
else:
|
||||||
[callble(which) for p, _, callble in heapq.nlargest(len(self._observer_callables_), self._observer_callables_) if p > min_priority]
|
for p, _, callble in self._observer_callables_:
|
||||||
|
if p <= min_priority:
|
||||||
|
break
|
||||||
|
callble(which)
|
||||||
|
|
||||||
|
def _insert_sorted(self, p, o, c):
|
||||||
|
ins = 0
|
||||||
|
for pr, _, _ in self._observer_callables_:
|
||||||
|
if p > pr:
|
||||||
|
break
|
||||||
|
ins += 1
|
||||||
|
self._observer_callables_.insert(ins, (p, o, c))
|
||||||
|
|
||||||
class Pickleable(object):
|
class Pickleable(object):
|
||||||
def _getstate(self):
|
def _getstate(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -202,20 +213,17 @@ class Constrainable(Nameable, Indexable):
|
||||||
unfix = unconstrain_fixed
|
unfix = unconstrain_fixed
|
||||||
|
|
||||||
def _set_fixed(self, index):
|
def _set_fixed(self, index):
|
||||||
import numpy as np
|
|
||||||
if not self._has_fixes(): self._fixes_ = np.ones(self.size, dtype=bool)
|
if not self._has_fixes(): self._fixes_ = np.ones(self.size, dtype=bool)
|
||||||
self._fixes_[index] = FIXED
|
self._fixes_[index] = FIXED
|
||||||
if np.all(self._fixes_): self._fixes_ = None # ==UNFIXED
|
if np.all(self._fixes_): self._fixes_ = None # ==UNFIXED
|
||||||
|
|
||||||
def _set_unfixed(self, index):
|
def _set_unfixed(self, index):
|
||||||
import numpy as np
|
|
||||||
if not self._has_fixes(): self._fixes_ = np.ones(self.size, dtype=bool)
|
if not self._has_fixes(): self._fixes_ = np.ones(self.size, dtype=bool)
|
||||||
# rav_i = self._raveled_index_for(param)[index]
|
# rav_i = self._raveled_index_for(param)[index]
|
||||||
self._fixes_[index] = UNFIXED
|
self._fixes_[index] = UNFIXED
|
||||||
if np.all(self._fixes_): self._fixes_ = None # ==UNFIXED
|
if np.all(self._fixes_): self._fixes_ = None # ==UNFIXED
|
||||||
|
|
||||||
def _connect_fixes(self):
|
def _connect_fixes(self):
|
||||||
import numpy as np
|
|
||||||
fixed_indices = self.constraints[__fixed__]
|
fixed_indices = self.constraints[__fixed__]
|
||||||
if fixed_indices.size > 0:
|
if fixed_indices.size > 0:
|
||||||
self._fixes_ = np.ones(self.size, dtype=bool) * UNFIXED
|
self._fixes_ = np.ones(self.size, dtype=bool) * UNFIXED
|
||||||
|
|
@ -245,7 +253,6 @@ class Constrainable(Nameable, Indexable):
|
||||||
|
|
||||||
def _log_prior_gradients(self):
|
def _log_prior_gradients(self):
|
||||||
"""evaluate the gradients of the priors"""
|
"""evaluate the gradients of the priors"""
|
||||||
import numpy as np
|
|
||||||
if self.priors.size > 0:
|
if self.priors.size > 0:
|
||||||
x = self._get_params()
|
x = self._get_params()
|
||||||
ret = np.zeros(x.size)
|
ret = np.zeros(x.size)
|
||||||
|
|
@ -342,7 +349,6 @@ class Constrainable(Nameable, Indexable):
|
||||||
def _remove_from_index_operations(self, which, transforms):
|
def _remove_from_index_operations(self, which, transforms):
|
||||||
if len(transforms) == 0:
|
if len(transforms) == 0:
|
||||||
transforms = which.properties()
|
transforms = which.properties()
|
||||||
import numpy as np
|
|
||||||
removed = np.empty((0,), dtype=int)
|
removed = np.empty((0,), dtype=int)
|
||||||
for t in transforms:
|
for t in transforms:
|
||||||
unconstrained = which.remove(t, self._raveled_index())
|
unconstrained = which.remove(t, self._raveled_index())
|
||||||
|
|
@ -404,7 +410,6 @@ class OptimizationHandlable(Constrainable, Observable):
|
||||||
Randomize the model.
|
Randomize the model.
|
||||||
Make this draw from the prior if one exists, else draw from N(0,1)
|
Make this draw from the prior if one exists, else draw from N(0,1)
|
||||||
"""
|
"""
|
||||||
import numpy as np
|
|
||||||
# first take care of all parameters (from N(0,1))
|
# first take care of all parameters (from N(0,1))
|
||||||
# x = self._get_params_transformed()
|
# x = self._get_params_transformed()
|
||||||
x = np.random.randn(self._size_transformed())
|
x = np.random.randn(self._size_transformed())
|
||||||
|
|
@ -413,9 +418,6 @@ class OptimizationHandlable(Constrainable, Observable):
|
||||||
[np.put(x, ind, p.rvs(ind.size)) for p, ind in self.priors.iteritems() if not p is None]
|
[np.put(x, ind, p.rvs(ind.size)) for p, ind in self.priors.iteritems() if not p is None]
|
||||||
self._set_params(x)
|
self._set_params(x)
|
||||||
# self._set_params_transformed(self._get_params_transformed()) # makes sure all of the tied parameters get the same init (since there's only one prior object...)
|
# self._set_params_transformed(self._get_params_transformed()) # makes sure all of the tied parameters get the same init (since there's only one prior object...)
|
||||||
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
class Parameterizable(OptimizationHandlable):
|
class Parameterizable(OptimizationHandlable):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
@ -474,7 +476,113 @@ class Parameterizable(OptimizationHandlable):
|
||||||
def _set_gradient(self, g):
|
def _set_gradient(self, g):
|
||||||
import itertools
|
import itertools
|
||||||
[p._set_gradient(g[s]) for p, s in itertools.izip(self._parameters_, self._param_slices_)]
|
[p._set_gradient(g[s]) for p, s in itertools.izip(self._parameters_, self._param_slices_)]
|
||||||
|
|
||||||
|
def add_parameter(self, param, index=None):
|
||||||
|
"""
|
||||||
|
:param parameters: the parameters to add
|
||||||
|
:type parameters: list of or one :py:class:`GPy.core.param.Param`
|
||||||
|
:param [index]: index of where to put parameters
|
||||||
|
|
||||||
|
|
||||||
|
Add all parameters to this param class, you can insert parameters
|
||||||
|
at any given index using the :func:`list.insert` syntax
|
||||||
|
"""
|
||||||
|
# if param.has_parent():
|
||||||
|
# raise AttributeError, "parameter {} already in another model, create new object (or copy) for adding".format(param._short())
|
||||||
|
if param in self._parameters_ and index is not None:
|
||||||
|
self.remove_parameter(param)
|
||||||
|
self.add_parameter(param, index)
|
||||||
|
elif param not in self._parameters_:
|
||||||
|
if param.has_parent():
|
||||||
|
parent = param._direct_parent_
|
||||||
|
while parent is not None:
|
||||||
|
if parent is self:
|
||||||
|
raise HierarchyError, "You cannot add a parameter twice into the hirarchy"
|
||||||
|
parent = parent._direct_parent_
|
||||||
|
param._direct_parent_.remove_parameter(param)
|
||||||
|
# make sure the size is set
|
||||||
|
if index is None:
|
||||||
|
self.constraints.update(param.constraints, self.size)
|
||||||
|
self.priors.update(param.priors, self.size)
|
||||||
|
self._parameters_.append(param)
|
||||||
|
else:
|
||||||
|
start = sum(p.size for p in self._parameters_[:index])
|
||||||
|
self.constraints.shift_right(start, param.size)
|
||||||
|
self.priors.shift_right(start, param.size)
|
||||||
|
self.constraints.update(param.constraints, start)
|
||||||
|
self.priors.update(param.priors, start)
|
||||||
|
self._parameters_.insert(index, param)
|
||||||
|
|
||||||
|
param.add_observer(self, self._pass_through_notify_observers, -np.inf)
|
||||||
|
|
||||||
|
self.size += param.size
|
||||||
|
|
||||||
|
self._connect_parameters()
|
||||||
|
self._notify_parent_change()
|
||||||
|
self._connect_fixes()
|
||||||
|
else:
|
||||||
|
raise RuntimeError, """Parameter exists already added and no copy made"""
|
||||||
|
|
||||||
|
|
||||||
|
def add_parameters(self, *parameters):
|
||||||
|
"""
|
||||||
|
convenience method for adding several
|
||||||
|
parameters without gradient specification
|
||||||
|
"""
|
||||||
|
[self.add_parameter(p) for p in parameters]
|
||||||
|
|
||||||
|
def remove_parameter(self, param):
|
||||||
|
"""
|
||||||
|
: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())
|
||||||
|
|
||||||
|
start = sum([p.size for p in self._parameters_[:param._parent_index_]])
|
||||||
|
self._remove_parameter_name(param)
|
||||||
|
self.size -= param.size
|
||||||
|
del self._parameters_[param._parent_index_]
|
||||||
|
|
||||||
|
param._disconnect_parent()
|
||||||
|
param.remove_observer(self, self._pass_through_notify_observers)
|
||||||
|
self.constraints.shift_left(start, param.size)
|
||||||
|
|
||||||
|
self._connect_fixes()
|
||||||
|
self._connect_parameters()
|
||||||
|
self._notify_parent_change()
|
||||||
|
|
||||||
|
parent = self._direct_parent_
|
||||||
|
while parent is not None:
|
||||||
|
parent._connect_fixes()
|
||||||
|
parent._connect_parameters()
|
||||||
|
parent._notify_parent_change()
|
||||||
|
parent = parent._direct_parent_
|
||||||
|
|
||||||
|
def _connect_parameters(self):
|
||||||
|
# connect parameterlist to this parameterized object
|
||||||
|
# This just sets up the right connection for the params objects
|
||||||
|
# to be used as parameters
|
||||||
|
# it also sets the constraints for each parameter to the constraints
|
||||||
|
# of their respective parents
|
||||||
|
if not hasattr(self, "_parameters_") or len(self._parameters_) < 1:
|
||||||
|
# no parameters for this class
|
||||||
|
return
|
||||||
|
sizes = [0]
|
||||||
|
self._param_slices_ = []
|
||||||
|
for i, p in enumerate(self._parameters_):
|
||||||
|
p._direct_parent_ = self
|
||||||
|
p._parent_index_ = i
|
||||||
|
sizes.append(p.size + sizes[-1])
|
||||||
|
self._param_slices_.append(slice(sizes[-2], sizes[-1]))
|
||||||
|
self._add_parameter_name(p)
|
||||||
|
|
||||||
|
#===========================================================================
|
||||||
|
# notification system
|
||||||
|
#===========================================================================
|
||||||
|
def _parameters_changed_notification(self, which):
|
||||||
|
self.parameters_changed()
|
||||||
|
def _pass_through_notify_observers(self, which):
|
||||||
|
self._notify_observers(which)
|
||||||
|
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# TODO: not working yet
|
# TODO: not working yet
|
||||||
|
|
@ -487,16 +595,17 @@ class Parameterizable(OptimizationHandlable):
|
||||||
|
|
||||||
dc = dict()
|
dc = dict()
|
||||||
for k, v in self.__dict__.iteritems():
|
for k, v in self.__dict__.iteritems():
|
||||||
if k not in ['_direct_parent_', '_parameters_', '_parent_index_'] + self.parameter_names():
|
if k not in ['_direct_parent_', '_parameters_', '_parent_index_', '_observer_callables_'] + self.parameter_names():
|
||||||
if isinstance(v, (Constrainable, ParameterIndexOperations, ParameterIndexOperationsView)):
|
if isinstance(v, (Constrainable, ParameterIndexOperations, ParameterIndexOperationsView)):
|
||||||
dc[k] = v.copy()
|
dc[k] = v.copy()
|
||||||
else:
|
else:
|
||||||
dc[k] = copy.deepcopy(v)
|
dc[k] = copy.deepcopy(v)
|
||||||
if k == '_parameters_':
|
if k == '_parameters_':
|
||||||
params = [p.copy() for p in v]
|
params = [p.copy() for p in v]
|
||||||
|
|
||||||
dc['_direct_parent_'] = None
|
dc['_direct_parent_'] = None
|
||||||
dc['_parent_index_'] = None
|
dc['_parent_index_'] = None
|
||||||
|
dc['_observer_callables_'] = []
|
||||||
dc['_parameters_'] = ArrayList()
|
dc['_parameters_'] = ArrayList()
|
||||||
dc['constraints'].clear()
|
dc['constraints'].clear()
|
||||||
dc['priors'].clear()
|
dc['priors'].clear()
|
||||||
|
|
@ -506,6 +615,7 @@ class Parameterizable(OptimizationHandlable):
|
||||||
s.__dict__ = dc
|
s.__dict__ = dc
|
||||||
|
|
||||||
for p in params:
|
for p in params:
|
||||||
|
import ipdb;ipdb.set_trace()
|
||||||
s.add_parameter(p)
|
s.add_parameter(p)
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
|
||||||
|
|
@ -88,114 +88,6 @@ class Parameterized(Parameterizable, Pickleable, Gradcheckable):
|
||||||
return G
|
return G
|
||||||
return node
|
return node
|
||||||
|
|
||||||
|
|
||||||
def add_parameter(self, param, index=None):
|
|
||||||
"""
|
|
||||||
:param parameters: the parameters to add
|
|
||||||
:type parameters: list of or one :py:class:`GPy.core.param.Param`
|
|
||||||
:param [index]: index of where to put parameters
|
|
||||||
|
|
||||||
|
|
||||||
Add all parameters to this param class, you can insert parameters
|
|
||||||
at any given index using the :func:`list.insert` syntax
|
|
||||||
"""
|
|
||||||
# if param.has_parent():
|
|
||||||
# raise AttributeError, "parameter {} already in another model, create new object (or copy) for adding".format(param._short())
|
|
||||||
if param in self._parameters_ and index is not None:
|
|
||||||
self.remove_parameter(param)
|
|
||||||
self.add_parameter(param, index)
|
|
||||||
elif param not in self._parameters_:
|
|
||||||
if param.has_parent():
|
|
||||||
parent = param._direct_parent_
|
|
||||||
while parent is not None:
|
|
||||||
if parent is self:
|
|
||||||
from GPy.core.parameterization.parameter_core import HierarchyError
|
|
||||||
raise HierarchyError, "You cannot add a parameter twice into the hirarchy"
|
|
||||||
parent = parent._direct_parent_
|
|
||||||
param._direct_parent_.remove_parameter(param)
|
|
||||||
# make sure the size is set
|
|
||||||
if index is None:
|
|
||||||
self.constraints.update(param.constraints, self.size)
|
|
||||||
self.priors.update(param.priors, self.size)
|
|
||||||
self._parameters_.append(param)
|
|
||||||
else:
|
|
||||||
start = sum(p.size for p in self._parameters_[:index])
|
|
||||||
self.constraints.shift_right(start, param.size)
|
|
||||||
self.priors.shift_right(start, param.size)
|
|
||||||
self.constraints.update(param.constraints, start)
|
|
||||||
self.priors.update(param.priors, start)
|
|
||||||
self._parameters_.insert(index, param)
|
|
||||||
|
|
||||||
param.add_observer(self, self._pass_through_notify_observers, -np.inf)
|
|
||||||
|
|
||||||
self.size += param.size
|
|
||||||
|
|
||||||
self._connect_parameters()
|
|
||||||
self._notify_parent_change()
|
|
||||||
self._connect_fixes()
|
|
||||||
else:
|
|
||||||
raise RuntimeError, """Parameter exists already added and no copy made"""
|
|
||||||
|
|
||||||
|
|
||||||
def add_parameters(self, *parameters):
|
|
||||||
"""
|
|
||||||
convenience method for adding several
|
|
||||||
parameters without gradient specification
|
|
||||||
"""
|
|
||||||
[self.add_parameter(p) for p in parameters]
|
|
||||||
|
|
||||||
def remove_parameter(self, param):
|
|
||||||
"""
|
|
||||||
: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())
|
|
||||||
|
|
||||||
start = sum([p.size for p in self._parameters_[:param._parent_index_]])
|
|
||||||
self._remove_parameter_name(param)
|
|
||||||
self.size -= param.size
|
|
||||||
del self._parameters_[param._parent_index_]
|
|
||||||
|
|
||||||
param._disconnect_parent()
|
|
||||||
param.remove_observer(self, self._pass_through_notify_observers)
|
|
||||||
self.constraints.shift_left(start, param.size)
|
|
||||||
|
|
||||||
self._connect_fixes()
|
|
||||||
self._connect_parameters()
|
|
||||||
self._notify_parent_change()
|
|
||||||
|
|
||||||
parent = self._direct_parent_
|
|
||||||
while parent is not None:
|
|
||||||
parent._connect_fixes()
|
|
||||||
parent._connect_parameters()
|
|
||||||
parent._notify_parent_change()
|
|
||||||
parent = parent._direct_parent_
|
|
||||||
|
|
||||||
def _connect_parameters(self):
|
|
||||||
# connect parameterlist to this parameterized object
|
|
||||||
# This just sets up the right connection for the params objects
|
|
||||||
# to be used as parameters
|
|
||||||
# it also sets the constraints for each parameter to the constraints
|
|
||||||
# of their respective parents
|
|
||||||
if not hasattr(self, "_parameters_") or len(self._parameters_) < 1:
|
|
||||||
# no parameters for this class
|
|
||||||
return
|
|
||||||
sizes = [0]
|
|
||||||
self._param_slices_ = []
|
|
||||||
for i, p in enumerate(self._parameters_):
|
|
||||||
p._direct_parent_ = self
|
|
||||||
p._parent_index_ = i
|
|
||||||
sizes.append(p.size + sizes[-1])
|
|
||||||
self._param_slices_.append(slice(sizes[-2], sizes[-1]))
|
|
||||||
self._add_parameter_name(p)
|
|
||||||
|
|
||||||
#===========================================================================
|
|
||||||
# notification system
|
|
||||||
#===========================================================================
|
|
||||||
def _parameters_changed_notification(self, which):
|
|
||||||
self.parameters_changed()
|
|
||||||
def _pass_through_notify_observers(self, which):
|
|
||||||
self._notify_observers(which)
|
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# Pickling operations
|
# Pickling operations
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
|
|
@ -212,6 +104,11 @@ class Parameterized(Parameterizable, Pickleable, Gradcheckable):
|
||||||
else:
|
else:
|
||||||
cPickle.dump(self, f, protocol)
|
cPickle.dump(self, f, protocol)
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
c = super(Parameterized, self).copy()
|
||||||
|
c.add_observer(c, c._parameters_changed_notification, -100)
|
||||||
|
return c
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
if self._has_get_set_state():
|
if self._has_get_set_state():
|
||||||
return self._getstate()
|
return self._getstate()
|
||||||
|
|
@ -332,9 +229,13 @@ class Parameterized(Parameterizable, Pickleable, Gradcheckable):
|
||||||
return ParamConcatenation(paramlist)
|
return ParamConcatenation(paramlist)
|
||||||
|
|
||||||
def __setitem__(self, name, value, paramlist=None):
|
def __setitem__(self, name, value, paramlist=None):
|
||||||
try: param = self.__getitem__(name, paramlist)
|
if isinstance(name, slice):
|
||||||
except AttributeError as a: raise a
|
self[''][name] = value
|
||||||
param[:] = value
|
else:
|
||||||
|
try: param = self.__getitem__(name, paramlist)
|
||||||
|
except AttributeError as a: raise a
|
||||||
|
param[:] = value
|
||||||
|
|
||||||
def __setattr__(self, name, val):
|
def __setattr__(self, name, val):
|
||||||
# override the default behaviour, if setting a param, so broadcasting can by used
|
# override the default behaviour, if setting a param, so broadcasting can by used
|
||||||
if hasattr(self, '_parameters_'):
|
if hasattr(self, '_parameters_'):
|
||||||
|
|
@ -379,7 +280,7 @@ class Parameterized(Parameterizable, Pickleable, Gradcheckable):
|
||||||
cl = max([len(str(x)) if x else 0 for x in constrs + ["Constraint"]])
|
cl = max([len(str(x)) if x else 0 for x in constrs + ["Constraint"]])
|
||||||
tl = max([len(str(x)) if x else 0 for x in ts + ["Tied to"]])
|
tl = max([len(str(x)) if x else 0 for x in ts + ["Tied to"]])
|
||||||
pl = max([len(str(x)) if x else 0 for x in prirs + ["Prior"]])
|
pl = max([len(str(x)) if x else 0 for x in prirs + ["Prior"]])
|
||||||
format_spec = " \033[1m{{name:<{0}s}}\033[0;0m | {{desc:^{1}s}} | {{const:^{2}s}} | {{pri:^{3}s}} | {{t:^{4}s}}".format(nl, sl, cl, pl, tl)
|
format_spec = " \033[1m{{name:<{0}s}}\033[0;0m | {{desc:>{1}s}} | {{const:^{2}s}} | {{pri:^{3}s}} | {{t:^{4}s}}".format(nl, sl, cl, pl, tl)
|
||||||
to_print = []
|
to_print = []
|
||||||
for n, d, c, t, p in itertools.izip(names, desc, constrs, ts, prirs):
|
for n, d, c, t, p in itertools.izip(names, desc, constrs, ts, prirs):
|
||||||
to_print.append(format_spec.format(name=n, desc=d, const=c, t=t, pri=p))
|
to_print.append(format_spec.format(name=n, desc=d, const=c, t=t, pri=p))
|
||||||
|
|
|
||||||
|
|
@ -114,14 +114,12 @@ class SparseGP(GP):
|
||||||
def _getstate(self):
|
def _getstate(self):
|
||||||
"""
|
"""
|
||||||
Get the current state of the class,
|
Get the current state of the class,
|
||||||
here just all the indices, rest can get recomputed
|
|
||||||
"""
|
"""
|
||||||
return GP._getstate(self) + [self.Z,
|
return GP._getstate(self) + [
|
||||||
self.num_inducing,
|
self.Z,
|
||||||
self.X_variance]
|
self.num_inducing]
|
||||||
|
|
||||||
def _setstate(self, state):
|
def _setstate(self, state):
|
||||||
self.X_variance = state.pop()
|
|
||||||
self.num_inducing = state.pop()
|
self.num_inducing = state.pop()
|
||||||
self.Z = state.pop()
|
self.Z = state.pop()
|
||||||
GP._setstate(self, state)
|
GP._setstate(self, state)
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ class Kern(Parameterized):
|
||||||
See GPy.plotting.matplot_dep.plot
|
See GPy.plotting.matplot_dep.plot
|
||||||
"""
|
"""
|
||||||
assert "matplotlib" in sys.modules, "matplotlib package has not been imported."
|
assert "matplotlib" in sys.modules, "matplotlib package has not been imported."
|
||||||
from ..plotting.matplot_dep import kernel_plots
|
from ...plotting.matplot_dep import kernel_plots
|
||||||
kernel_plots.plot(self,*args)
|
kernel_plots.plot(self,*args)
|
||||||
|
|
||||||
def plot_ARD(self, *args, **kw):
|
def plot_ARD(self, *args, **kw):
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ class SparseGPRegressionUncertainInput(SparseGP):
|
||||||
|
|
||||||
# kern defaults to rbf (plus white for stability)
|
# kern defaults to rbf (plus white for stability)
|
||||||
if kernel is None:
|
if kernel is None:
|
||||||
kernel = kern.rbf(input_dim) + kern.white(input_dim, variance=1e-3)
|
kernel = kern.RBF(input_dim) + kern.White(input_dim, variance=1e-3)
|
||||||
|
|
||||||
# Z defaults to a subset of the data
|
# Z defaults to a subset of the data
|
||||||
if Z is None:
|
if Z is None:
|
||||||
|
|
@ -99,5 +99,5 @@ class SparseGPRegressionUncertainInput(SparseGP):
|
||||||
|
|
||||||
likelihood = likelihoods.Gaussian()
|
likelihood = likelihoods.Gaussian()
|
||||||
|
|
||||||
SparseGP.__init__(self, X, Y, Z, kernel, likelihood, X_variance=X_variance)
|
SparseGP.__init__(self, X, Y, Z, kernel, likelihood, X_variance=X_variance, inference_method=VarDTC())
|
||||||
self.ensure_default_constraints()
|
self.ensure_default_constraints()
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ def plot(kernel, x=None, plot_limits=None, which_parts='all', resolution=None, *
|
||||||
raise ValueError, "Bad limits for plotting"
|
raise ValueError, "Bad limits for plotting"
|
||||||
|
|
||||||
Xnew = np.linspace(xmin, xmax, resolution or 201)[:, None]
|
Xnew = np.linspace(xmin, xmax, resolution or 201)[:, None]
|
||||||
Kx = kernel.K(Xnew, x, which_parts)
|
Kx = kernel.K(Xnew, x)
|
||||||
pb.plot(Xnew, Kx, *args, **kwargs)
|
pb.plot(Xnew, Kx, *args, **kwargs)
|
||||||
pb.xlim(xmin, xmax)
|
pb.xlim(xmin, xmax)
|
||||||
pb.xlabel("x")
|
pb.xlabel("x")
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ class Test(unittest.TestCase):
|
||||||
self.par.add_observer(self, self._trigger, -1)
|
self.par.add_observer(self, self._trigger, -1)
|
||||||
self.assertEqual(self.par.params_changed_count, 0, 'no params changed yet')
|
self.assertEqual(self.par.params_changed_count, 0, 'no params changed yet')
|
||||||
self.assertEqual(self.par.params_changed_count, self.parent.parent_changed_count, 'parent should be triggered as often as param')
|
self.assertEqual(self.par.params_changed_count, self.parent.parent_changed_count, 'parent should be triggered as often as param')
|
||||||
|
|
||||||
self.p[0,1] = 3 # trigger observers
|
self.p[0,1] = 3 # trigger observers
|
||||||
self.assertEqual(self._observer_triggered, 3, 'observer should have triggered')
|
self.assertEqual(self._observer_triggered, 3, 'observer should have triggered')
|
||||||
self.assertEqual(self._trigger_count, 1, 'observer should have triggered once')
|
self.assertEqual(self._trigger_count, 1, 'observer should have triggered once')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue