diff --git a/GPy/likelihoods/laplace.py b/GPy/likelihoods/laplace.py index 6a44d5b6..6941de48 100644 --- a/GPy/likelihoods/laplace.py +++ b/GPy/likelihoods/laplace.py @@ -278,7 +278,10 @@ class Laplace(likelihood): #W is diagonal so its sqrt is just the sqrt of the diagonal elements W_12 = np.sqrt(W) B = np.eye(self.N) + W_12*K*W_12.T - L = jitchol(B) + try: + L = jitchol(B) + except: + import ipdb; ipdb.set_trace() W12BiW12 = W_12*dpotrs(L, np.asfortranarray(W_12*a), lower=1)[0] ln_B_det = 2*np.sum(np.log(np.diag(L))) diff --git a/GPy/likelihoods/noise_models/bernoulli_noise.py b/GPy/likelihoods/noise_models/bernoulli_noise.py index 17390e55..14f4adc8 100644 --- a/GPy/likelihoods/noise_models/bernoulli_noise.py +++ b/GPy/likelihoods/noise_models/bernoulli_noise.py @@ -22,6 +22,8 @@ class Bernoulli(NoiseDistribution): """ def __init__(self,gp_link=None,analytical_mean=False,analytical_variance=False): super(Bernoulli, self).__init__(gp_link,analytical_mean,analytical_variance) + if isinstance(gp_link , (gp_transformations.Heaviside, gp_transformations.Probit)): + self.log_concave = True def _preprocess_values(self,Y): """ diff --git a/GPy/likelihoods/noise_models/gaussian_noise.py b/GPy/likelihoods/noise_models/gaussian_noise.py index fce84d27..3da6bcc8 100644 --- a/GPy/likelihoods/noise_models/gaussian_noise.py +++ b/GPy/likelihoods/noise_models/gaussian_noise.py @@ -24,6 +24,8 @@ class Gaussian(NoiseDistribution): self.N = N self._set_params(np.asarray(variance)) super(Gaussian, self).__init__(gp_link,analytical_mean,analytical_variance) + if isinstance(gp_link , gp_transformations.Identity): + self.log_concave = True def _get_params(self): return np.array([self.variance]) diff --git a/GPy/likelihoods/noise_models/noise_distributions.py b/GPy/likelihoods/noise_models/noise_distributions.py index 8ee7a2cd..a67d8792 100644 --- a/GPy/likelihoods/noise_models/noise_distributions.py +++ b/GPy/likelihoods/noise_models/noise_distributions.py @@ -33,7 +33,7 @@ class NoiseDistribution(object): else: self.predictive_variance = self._predictive_variance_numerical - self.log_concave = True + self.log_concave = False def _get_params(self): return np.zeros(0) diff --git a/GPy/testing/likelihoods_tests.py b/GPy/testing/likelihoods_tests.py index 8d1466fb..709fe002 100644 --- a/GPy/testing/likelihoods_tests.py +++ b/GPy/testing/likelihoods_tests.py @@ -186,33 +186,33 @@ class TestNoiseModels(object): "laplace": True, "ep": True }, - "Gaussian_log": { - "model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Log(), variance=self.var, D=self.D, N=self.N), - "grad_params": { - "names": ["noise_model_variance"], - "vals": [self.var], - "constraints": [constrain_positive] - }, - "laplace": True - }, - "Gaussian_probit": { - "model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Probit(), variance=self.var, D=self.D, N=self.N), - "grad_params": { - "names": ["noise_model_variance"], - "vals": [self.var], - "constraints": [constrain_positive] - }, - "laplace": True - }, - "Gaussian_log_ex": { - "model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Log_ex_1(), variance=self.var, D=self.D, N=self.N), - "grad_params": { - "names": ["noise_model_variance"], - "vals": [self.var], - "constraints": [constrain_positive] - }, - "laplace": True - }, + #"Gaussian_log": { + #"model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Log(), variance=self.var, D=self.D, N=self.N), + #"grad_params": { + #"names": ["noise_model_variance"], + #"vals": [self.var], + #"constraints": [constrain_positive] + #}, + #"laplace": True + #}, + #"Gaussian_probit": { + #"model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Probit(), variance=self.var, D=self.D, N=self.N), + #"grad_params": { + #"names": ["noise_model_variance"], + #"vals": [self.var], + #"constraints": [constrain_positive] + #}, + #"laplace": True + #}, + #"Gaussian_log_ex": { + #"model": GPy.likelihoods.gaussian(gp_link=gp_transformations.Log_ex_1(), variance=self.var, D=self.D, N=self.N), + #"grad_params": { + #"names": ["noise_model_variance"], + #"vals": [self.var], + #"constraints": [constrain_positive] + #}, + #"laplace": True + #}, "Bernoulli_default": { "model": GPy.likelihoods.bernoulli(), "link_f_constraints": [partial(constrain_bounded, lower=0, upper=1)], @@ -253,6 +253,7 @@ class TestNoiseModels(object): param_vals = [] param_names = [] constrain_positive = [] + param_constraints = [] # ??? TODO: Saul to Fix. if "link_f_constraints" in attributes: link_f_constraints = attributes["link_f_constraints"] else: @@ -490,8 +491,14 @@ class TestNoiseModels(object): constraints[param_num](name, m) m.randomize() - m.checkgrad(verbose=1, step=step) + m.optimize(max_iters=8) print m + m.checkgrad(verbose=1, step=step) + if not m.checkgrad(step=step): + m.checkgrad(verbose=1, step=step) + import ipdb; ipdb.set_trace() + #NOTE this test appears to be stochastic for some likelihoods (student t?) + # appears to all be working in test mode right now... assert m.checkgrad(step=step) ###########