mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-02 16:22:39 +02:00
Automatic fallback to Numpy if Cython modules not available
This commit is contained in:
parent
276330d1d1
commit
e7a9b53506
5 changed files with 53 additions and 31 deletions
|
|
@ -6,9 +6,16 @@ import numpy as np
|
|||
import GPy
|
||||
import sys
|
||||
from GPy.core.parameterization.param import Param
|
||||
from ..util.config import config
|
||||
|
||||
verbose = 0
|
||||
|
||||
try:
|
||||
from . import linalg_cython
|
||||
config.set('cython', 'working', 'True')
|
||||
except ImportError:
|
||||
config.set('cython', 'working', 'False')
|
||||
|
||||
|
||||
class Kern_check_model(GPy.core.Model):
|
||||
"""
|
||||
|
|
@ -312,12 +319,12 @@ class KernelGradientTestsContinuous(unittest.TestCase):
|
|||
k = GPy.kern.LinearFull(self.D, self.D-1)
|
||||
k.randomize()
|
||||
self.assertTrue(check_kernel_gradient_functions(k, X=self.X, X2=self.X2, verbose=verbose))
|
||||
|
||||
|
||||
def test_standard_periodic(self):
|
||||
k = GPy.kern.StdPeriodic(self.D, self.D-1)
|
||||
k.randomize()
|
||||
self.assertTrue(check_kernel_gradient_functions(k, X=self.X, X2=self.X2, verbose=verbose))
|
||||
|
||||
|
||||
class KernelTestsMiscellaneous(unittest.TestCase):
|
||||
def setUp(self):
|
||||
N, D = 100, 10
|
||||
|
|
@ -371,6 +378,7 @@ class KernelTestsNonContinuous(unittest.TestCase):
|
|||
X2 = self.X2[self.X2[:,-1]!=2]
|
||||
self.assertTrue(check_kernel_gradient_functions(kern, X=X, X2=X2, verbose=verbose, fixed_X_dims=-1))
|
||||
|
||||
@unittest.skipIf(not config.getboolean('cython', 'working'),"Cython modules have not been built on this machine")
|
||||
class Coregionalize_cython_test(unittest.TestCase):
|
||||
"""
|
||||
Make sure that the coregionalize kernel work with and without cython enabled
|
||||
|
|
@ -438,28 +446,28 @@ class KernelTestsProductWithZeroValues(unittest.TestCase):
|
|||
"Gradient resulted in NaN")
|
||||
|
||||
class Kernel_Psi_statistics_GradientTests(unittest.TestCase):
|
||||
|
||||
|
||||
def setUp(self):
|
||||
from GPy.core.parameterization.variational import NormalPosterior
|
||||
N,M,Q = 100,20,3
|
||||
|
||||
|
||||
X = np.random.randn(N,Q)
|
||||
X_var = np.random.rand(N,Q)+0.01
|
||||
self.Z = np.random.randn(M,Q)
|
||||
self.qX = NormalPosterior(X, X_var)
|
||||
|
||||
|
||||
self.w1 = np.random.randn(N)
|
||||
self.w2 = np.random.randn(N,M)
|
||||
self.w3 = np.random.randn(M,M)
|
||||
self.w3 = np.random.randn(M,M)
|
||||
self.w3 = self.w3+self.w3.T
|
||||
self.w3n = np.random.randn(N,M,M)
|
||||
self.w3n = np.random.randn(N,M,M)
|
||||
self.w3n = self.w3n+np.swapaxes(self.w3n, 1,2)
|
||||
|
||||
|
||||
def test_kernels(self):
|
||||
from GPy.kern import RBF,Linear
|
||||
Q = self.Z.shape[1]
|
||||
kernels = [RBF(Q,ARD=True), Linear(Q,ARD=True)]
|
||||
|
||||
|
||||
for k in kernels:
|
||||
k.randomize()
|
||||
self._test_kernel_param(k)
|
||||
|
|
@ -476,12 +484,12 @@ class Kernel_Psi_statistics_GradientTests(unittest.TestCase):
|
|||
psi0 = kernel.psi0(self.Z, self.qX)
|
||||
psi1 = kernel.psi1(self.Z, self.qX)
|
||||
if not psi2n:
|
||||
psi2 = kernel.psi2(self.Z, self.qX)
|
||||
psi2 = kernel.psi2(self.Z, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3*psi2).sum()
|
||||
else:
|
||||
psi2 = kernel.psi2n(self.Z, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3n*psi2).sum()
|
||||
|
||||
|
||||
def df(p):
|
||||
kernel.param_array[:] = p
|
||||
kernel.update_gradients_expectations(self.w1, self.w2, self.w3 if not psi2n else self.w3n, self.Z, self.qX)
|
||||
|
|
@ -492,39 +500,39 @@ class Kernel_Psi_statistics_GradientTests(unittest.TestCase):
|
|||
self.assertTrue(m.checkgrad())
|
||||
|
||||
def _test_Z(self, kernel, psi2n=False):
|
||||
|
||||
|
||||
def f(p):
|
||||
psi0 = kernel.psi0(p, self.qX)
|
||||
psi1 = kernel.psi1(p, self.qX)
|
||||
psi2 = kernel.psi2(p, self.qX)
|
||||
if not psi2n:
|
||||
psi2 = kernel.psi2(p, self.qX)
|
||||
psi2 = kernel.psi2(p, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3*psi2).sum()
|
||||
else:
|
||||
psi2 = kernel.psi2n(p, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3n*psi2).sum()
|
||||
|
||||
|
||||
def df(p):
|
||||
return kernel.gradients_Z_expectations(self.w1, self.w2, self.w3 if not psi2n else self.w3n, p, self.qX)
|
||||
|
||||
from GPy.models import GradientChecker
|
||||
m = GradientChecker(f, df, self.Z.copy())
|
||||
self.assertTrue(m.checkgrad())
|
||||
|
||||
|
||||
def _test_qX(self, kernel, psi2n=False):
|
||||
|
||||
|
||||
def f(p):
|
||||
self.qX.param_array[:] = p
|
||||
self.qX._trigger_params_changed()
|
||||
psi0 = kernel.psi0(self.Z, self.qX)
|
||||
psi1 = kernel.psi1(self.Z, self.qX)
|
||||
if not psi2n:
|
||||
psi2 = kernel.psi2(self.Z, self.qX)
|
||||
psi2 = kernel.psi2(self.Z, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3*psi2).sum()
|
||||
else:
|
||||
psi2 = kernel.psi2n(self.Z, self.qX)
|
||||
return (self.w1*psi0).sum() + (self.w2*psi1).sum() + (self.w3n*psi2).sum()
|
||||
|
||||
|
||||
def df(p):
|
||||
self.qX.param_array[:] = p
|
||||
self.qX._trigger_params_changed()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue