slicing support for kernel input dimension

This commit is contained in:
Max Zwiessele 2014-03-07 16:59:41 +00:00
parent 5f3524e7da
commit db5fd17609
10 changed files with 178 additions and 65 deletions

View file

@ -16,7 +16,7 @@ class ObservableArray(np.ndarray, Observable):
__array_priority__ = -1 # Never give back ObservableArray
def __new__(cls, input_array):
if not isinstance(input_array, ObservableArray):
obj = np.atleast_1d(input_array).view(cls)
obj = np.atleast_1d(np.require(input_array, dtype=np.float64, requirements=['W', 'C'])).view(cls)
else: obj = input_array
cls.__name__ = "ObservableArray\n "
return obj

View file

@ -15,7 +15,6 @@ Observable Pattern for patameterization
from transformations import Transformation, Logexp, NegativeLogexp, Logistic, __fixed__, FIXED, UNFIXED
import numpy as np
import itertools
__updated__ = '2013-12-16'
@ -43,6 +42,7 @@ class Observable(object):
_updated = True
def __init__(self, *args, **kwargs):
self._observer_callables_ = []
def __del__(self, *args, **kwargs):
del self._observer_callables_
@ -551,8 +551,8 @@ class OptimizationHandlable(Constrainable, Observable):
return p
def _set_params_transformed(self, p):
if p is self._param_array_:
p = p.copy()
#if p is self._param_array_:
p = p.copy()
if self._has_fixes(): self._param_array_[self._fixes_] = p
else: self._param_array_[:] = p
self.untransform()

View file

@ -66,10 +66,10 @@ class VariationalPosterior(Parameterized):
def __init__(self, means=None, variances=None, name=None, **kw):
super(VariationalPosterior, self).__init__(name=name, **kw)
self.mean = Param("mean", means)
self.ndim = self.mean.ndim
self.shape = self.mean.shape
self.variance = Param("variance", variances, Logexp())
self.add_parameters(self.mean, self.variance)
self.ndim = self.mean.ndim
self.shape = self.mean.shape
self.num_data, self.input_dim = self.mean.shape
if self.has_uncertain_inputs():
assert self.variance.shape == self.mean.shape, "need one variance per sample and dimenion"
@ -77,6 +77,18 @@ class VariationalPosterior(Parameterized):
def has_uncertain_inputs(self):
return not self.variance is None
def __getitem__(self, s):
import copy
n = self.__new__(self.__class__)
dc = copy.copy(self.__dict__)
dc['mean'] = dc['mean'][s]
dc['variance'] = dc['variance'][s]
dc['shape'] = dc['mean'].shape
dc['ndim'] = dc['ndim']
dc['num_data'], dc['input_dim'] = self.mean.shape[0], self.mean.shape[1] if dc['ndim'] > 1 else 1
n.__dict__ = dc
return n
class NormalPosterior(VariationalPosterior):
'''