Merge pull request #558 from SheffieldML/devel

Uniform prior fix for other domains
This commit is contained in:
Max Zwiessele 2017-10-06 12:51:01 +01:00 committed by GitHub
commit db88e1142b
7 changed files with 72 additions and 7 deletions

View file

@ -1,5 +1,31 @@
# Changelog
## v1.8.3 (2017-10-02)
### Fix
* Uniform prior instantiation. [mzwiessele]
* Use paramz 0.8.5. [mzwiessele]
### Other
* Bump version: 1.8.2 → 1.8.3. [mzwiessele]
## v1.8.2 (2017-10-02)
### Fix
* Uniform prior tests. [mzwiessele]
* Uniform prior can be positive and negative, depending on lower and upper bound. [mzwiessele]
### Other
* Bump version: 1.8.1 → 1.8.2. [mzwiessele]
## v1.8.1 (2017-10-02)
### Fix

View file

@ -1 +1 @@
__version__ = "1.8.1"
__version__ = "1.8.3"

View file

@ -5,7 +5,7 @@
import numpy as np
from scipy.special import gammaln, digamma
from ...util.linalg import pdinv
from paramz.domains import _REAL, _POSITIVE
from paramz.domains import _REAL, _POSITIVE, _NEGATIVE
import warnings
import weakref
@ -92,7 +92,6 @@ class Gaussian(Prior):
# self.constant = -0.5 * np.log(2 * np.pi * self.sigma2)
class Uniform(Prior):
domain = _REAL
_instances = []
def __new__(cls, lower=0, upper=1): # Singleton:
@ -101,13 +100,24 @@ class Uniform(Prior):
for instance in cls._instances:
if instance().lower == lower and instance().upper == upper:
return instance()
o = super(Prior, cls).__new__(cls, lower, upper)
newfunc = super(Prior, cls).__new__
if newfunc is object.__new__:
o = newfunc(cls)
else:
o = newfunc(cls, lower, upper)
cls._instances.append(weakref.ref(o))
return cls._instances[-1]()
def __init__(self, lower, upper):
self.lower = float(lower)
self.upper = float(upper)
assert self.lower < self.upper, "Lower needs to be strictly smaller than upper."
if self.lower >= 0:
self.domain = _POSITIVE
elif self.upper <= 0:
self.domain = _NEGATIVE
else:
self.domain = _REAL
def __str__(self):
return "[{:.2g}, {:.2g}]".format(self.lower, self.upper)

View file

@ -83,6 +83,35 @@ class PriorTests(unittest.TestCase):
# should raise an assertionerror.
self.assertRaises(AssertionError, m.rbf.set_prior, gaussian)
def test_uniform(self):
xmin, xmax = 1, 2.5*np.pi
b, C, SNR = 1, 0, 0.1
X = np.linspace(xmin, xmax, 500)
y = b*X + C + 1*np.sin(X)
y += 0.05*np.random.randn(len(X))
X, y = X[:, None], y[:, None]
m = GPy.models.SparseGPRegression(X, y)
uniform = GPy.priors.Uniform(0, 2)
m.rbf.set_prior(uniform)
m.randomize()
self.assertTrue(m.checkgrad())
m.Z.set_prior(uniform)
m.randomize()
self.assertTrue(m.checkgrad())
m.Z.unconstrain()
uniform = GPy.priors.Uniform(-1, 10)
m.Z.set_prior(uniform)
m.randomize()
self.assertTrue(m.checkgrad())
m.Z.constrain_negative()
uniform = GPy.priors.Uniform(-1, 0)
m.Z.set_prior(uniform)
m.randomize()
self.assertTrue(m.checkgrad())
def test_set_gaussian_for_reals(self):
xmin, xmax = 1, 2.5*np.pi
b, C, SNR = 1, 0, 0.1

View file

@ -3,7 +3,7 @@ environment:
secure: 8/ZjXFwtd1S7ixd7PJOpptupKKEDhm2da/q3unabJ00=
COVERALLS_REPO_TOKEN:
secure: d3Luic/ESkGaWnZrvWZTKrzO+xaVwJWaRCEP0F+K/9DQGPSRZsJ/Du5g3s4XF+tS
gpy_version: 1.8.1
gpy_version: 1.8.3
matrix:
- PYTHON_VERSION: 2.7
MINICONDA: C:\Miniconda-x64

View file

@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.8.1
current_version = 1.8.3
tag = True
commit = True

View file

@ -150,7 +150,7 @@ setup(name = 'GPy',
py_modules = ['GPy.__init__'],
test_suite = 'GPy.testing',
setup_requires = ['numpy>=1.7'],
install_requires = ['numpy>=1.7', 'scipy>=0.16', 'six', 'paramz>=0.8.3'],
install_requires = ['numpy>=1.7', 'scipy>=0.16', 'six', 'paramz>=0.8.5'],
extras_require = {'docs':['sphinx'],
'optional':['mpi4py',
'ipython>=4.0.0',