# -*- coding: utf-8 -*-

from __future__ import division

import numpy as np
from numpy.testing import assert_array_equal
from nose.tools import assert_raises
import george

from .. import MultiGP, kernels, priors
from ..multigp import _GPProcess


def test_gp_process():
    """GP multiprocessing"""

    x = np.array((-1, 0, 1), dtype=float)
    y = np.array((-.5, 0, 1), dtype=float)
    kernel = kernels.ExpSquaredKernel(1.)

    proc = _GPProcess(x, y, kernel)
    proc.start()

    gp = george.GP(kernel)
    gp.compute(x)

    mu = proc.send_cmd('predict', x, mean_only=True).get_result()
    mu_ = gp.predict(y, x, mean_only=True)

    err_msg = 'Inconsistent predictions from multiprocessing and normal GPs.'
    assert_array_equal(mu, mu_, err_msg=err_msg)

    t = -.75, .5
    proc.send_cmd('predict', t)
    mu, cov = proc.get_result()
    mu_, cov_ = gp.predict(y, t)

    assert_array_equal(mu, mu_, err_msg=err_msg)
    assert_array_equal(cov, cov_, err_msg=err_msg)

    proc.send_cmd('hello')
    assert_raises(ValueError, proc.get_result)

    proc.stop()


def test_multigp():
    """multivariate gaussian process"""

    # create random data
    nsamples, ndim, nfeatures = 5, 2, 2
    x = np.random.rand(nsamples, ndim)
    y = np.random.rand(nsamples, nfeatures)

    kernel = (
        1.*kernels.ExpSquaredKernel(np.ones(ndim), ndim=ndim) +
        kernels.WhiteKernel(1e-8, ndim=ndim)
    )
    mgp = MultiGP(x, y, kernel, npc=nfeatures)

    prior = (
        [priors.VariancePrior()] +
        [priors.LengthScalePrior()]*ndim +
        [priors.NoisePrior()]
    )

    mgp.train(prior, 10, 10)

    yexp = np.random.rand(nfeatures)
    yerr = .1 * yexp
    prior = priors.FlatPrior() * nfeatures

    mgp.calibrate(yexp, yerr, prior, 10, 10)

@@ -1476,25 +1476,24 @@
 = (%0A        
-%5B
 priors.Varia
@@ -1502,17 +1502,16 @@
 ePrior()
-%5D
  +%0A     
@@ -1509,25 +1509,24 @@
 ) +%0A        
-%5B
 priors.Lengt
@@ -1538,17 +1538,16 @@
 ePrior()
-%5D
 *ndim +%0A
@@ -1558,9 +1558,8 @@
     
-%5B
 prio
@@ -1577,9 +1577,8 @@
 or()
-%5D
 %0A   

Use native prior combinations in test.