#!/usr/bin/env python
import pytest

import sklearn.datasets as datasets
import sklearn.kernel_approximation as ka

import pandas_ml as pdml
import pandas_ml.util.testing as tm


class TestKernelApproximation(tm.TestCase):

    def test_objectmapper(self):
        df = pdml.ModelFrame([])
        self.assertIs(df.kernel_approximation.AdditiveChi2Sampler,
                      ka.AdditiveChi2Sampler)
        self.assertIs(df.kernel_approximation.Nystroem, ka.Nystroem)
        self.assertIs(df.kernel_approximation.RBFSampler, ka.RBFSampler)
        self.assertIs(df.kernel_approximation.SkewedChi2Sampler,
                      ka.SkewedChi2Sampler)

    @pytest.mark.parametrize("algo", ['AdditiveChi2Sampler'])
    def test_Classifications(self, algo):
        iris = datasets.load_iris()
        df = pdml.ModelFrame(iris)

        mod1 = getattr(df.kernel_approximation, algo)()
        mod2 = getattr(ka, algo)()

        df.fit(mod1)
        mod2.fit(iris.data)

        result = df.transform(mod1)
        expected = mod2.transform(iris.data)

        self.assertIsInstance(result, pdml.ModelFrame)
        self.assert_numpy_array_almost_equal(result.data.values, expected)

    @pytest.mark.parametrize("algo", ['Nystroem', 'RBFSampler',
                                      'SkewedChi2Sampler'])
    def test_Classifications_Random(self, algo):
        iris = datasets.load_iris()
        df = pdml.ModelFrame(iris)

        mod1 = getattr(df.kernel_approximation, algo)(random_state=self.random_state)
        mod2 = getattr(ka, algo)(random_state=self.random_state)

        df.fit(mod1)
        mod2.fit(iris.data)

        result = df.transform(mod1)
        expected = mod2.transform(iris.data)

        self.assertIsInstance(result, pdml.ModelFrame)
        self.assert_numpy_array_almost_equal(result.data.values, expected)