diff --git a/CHANGELOG.md b/CHANGELOG.md index ebd978a5..88d728b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/GPy/__version__.py b/GPy/__version__.py index 2d986fc5..a44132de 100644 --- a/GPy/__version__.py +++ b/GPy/__version__.py @@ -1 +1 @@ -__version__ = "1.8.1" +__version__ = "1.8.3" diff --git a/GPy/core/parameterization/priors.py b/GPy/core/parameterization/priors.py index 71b9833e..3d69f39e 100644 --- a/GPy/core/parameterization/priors.py +++ b/GPy/core/parameterization/priors.py @@ -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) diff --git a/GPy/testing/prior_tests.py b/GPy/testing/prior_tests.py index 23822a5a..377ae504 100644 --- a/GPy/testing/prior_tests.py +++ b/GPy/testing/prior_tests.py @@ -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 diff --git a/appveyor.yml b/appveyor.yml index 89890a3f..da9b0c95 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -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 diff --git a/setup.cfg b/setup.cfg index 3104039d..2cf9e856 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.8.1 +current_version = 1.8.3 tag = True commit = True diff --git a/setup.py b/setup.py index c3a75024..7d3a5355 100644 --- a/setup.py +++ b/setup.py @@ -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',