Beispiel #1
0
    def test_xmca_input(self):
        xMCA()
        xMCA(self.A)
        xMCA(self.A, self.B)
        with self.assertRaises(ValueError):
            xMCA(self.A, self.B, self.A)

        with self.assertRaises(TypeError):
            xMCA(np.array([1,2,3]))
    def test_rotated_mca(self):
        svalues = xr.open_dataarray(
            join(self.path, 'mca_c0_r10_p01_singular_values.nc'))
        eofs_A = xr.open_dataarray(
            join(self.path, 'mca_c0_r10_p01_sst_eofs.nc'))
        eofs_B = xr.open_dataarray(
            join(self.path, 'mca_c0_r10_p01_prcp_eofs.nc'))
        pcs_A = xr.open_dataarray(join(self.path, 'mca_c0_r10_p01_sst_pcs.nc'))
        pcs_B = xr.open_dataarray(join(self.path,
                                       'mca_c0_r10_p01_prcp_pcs.nc'))

        mca = xMCA(self.A, self.B)
        mca.set_field_names('sst', 'prcp')
        mca.solve()
        mca.rotate(10)
        np.testing.assert_allclose(svalues,
                                   mca.singular_values(),
                                   err_msg='singular values do not match')
        np.testing.assert_allclose(eofs_A,
                                   mca.eofs()['left'],
                                   err_msg='left eofs do not match')
        np.testing.assert_allclose(eofs_B,
                                   mca.eofs()['right'],
                                   err_msg='right eofs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca.pcs()['right'],
                                   err_msg='left pcs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca.pcs()['right'],
                                   err_msg='right pcs do not match')
        mca.plot(1)
        mca.save_analysis('./tests/integration')

        mca2 = xMCA()
        mca2.load_analysis(
            './tests/integration/xmca/sst_prcp/mca_c0_r10_p01.info')
        np.testing.assert_allclose(svalues,
                                   mca2.singular_values(),
                                   err_msg='singular values do not match')
        np.testing.assert_allclose(eofs_A,
                                   mca2.eofs()['left'],
                                   err_msg='left eofs do not match')
        np.testing.assert_allclose(eofs_B,
                                   mca2.eofs()['right'],
                                   err_msg='right eofs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca2.pcs()['right'],
                                   err_msg='left pcs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca2.pcs()['right'],
                                   err_msg='right pcs do not match')

        rmtree(join(getcwd(), 'tests/integration/xmca/'))
    def test_complex_mca(self):
        svalues = xr.open_dataarray(join(self.path,
                                         'mca_c1_r10_p01_singular_values.nc'),
                                    engine='h5netcdf')
        eofs_A = xr.open_dataarray(join(self.path,
                                        'mca_c1_r10_p01_sst_eofs.nc'),
                                   engine='h5netcdf')
        eofs_B = xr.open_dataarray(join(self.path,
                                        'mca_c1_r10_p01_prcp_eofs.nc'),
                                   engine='h5netcdf')
        pcs_B = xr.open_dataarray(join(self.path,
                                       'mca_c1_r10_p01_prcp_pcs.nc'),
                                  engine='h5netcdf')
        pcs_A = xr.open_dataarray(join(self.path, 'mca_c1_r10_p01_sst_pcs.nc'),
                                  engine='h5netcdf')

        mca = xMCA(self.A, self.B)
        mca.set_field_names('sst', 'prcp')
        mca.solve(complexify=True, theta=True, period=12)
        mca.rotate(10)
        np.testing.assert_allclose(svalues,
                                   mca.singular_values(),
                                   err_msg='singular values do not match')
        np.testing.assert_allclose(eofs_A,
                                   mca.eofs()['left'],
                                   err_msg='left eofs do not match')
        np.testing.assert_allclose(eofs_B,
                                   mca.eofs()['right'],
                                   err_msg='right eofs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca.pcs()['right'],
                                   err_msg='left pcs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca.pcs()['right'],
                                   err_msg='right pcs do not match')
        mca.plot(1)
        mca.save_analysis('./tests/integration')

        mca2 = xMCA()
        mca2.load_analysis(
            './tests/integration/xmca/sst_prcp/mca_c1_r10_p01.info')
        np.testing.assert_allclose(svalues,
                                   mca2.singular_values(),
                                   err_msg='singular values do not match')
        np.testing.assert_allclose(eofs_A,
                                   mca2.eofs()['left'],
                                   err_msg='left eofs do not match')
        np.testing.assert_allclose(eofs_B,
                                   mca2.eofs()['right'],
                                   err_msg='right eofs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca2.pcs()['right'],
                                   err_msg='left pcs do not match')
        np.testing.assert_allclose(pcs_B,
                                   mca2.pcs()['right'],
                                   err_msg='right pcs do not match')

        rmtree(join(getcwd(), 'tests/integration/xmca/'))

        @classmethod
        def tearDownClass(self):
            pass
    def test_standard_mca(self):
        files = {
            'svalues': 'mca_c0_r00_p00_singular_values.nc',
            'eofs_A': 'mca_c0_r00_p00_sst_eofs.nc',
            'eofs_B': 'mca_c0_r00_p00_prcp_eofs.nc',
            'pcs_A': 'mca_c0_r00_p00_sst_pcs.nc',
            'pcs_B': 'mca_c0_r00_p00_prcp_pcs.nc',
        }
        svalues = xr.open_dataarray(join(self.path,
                                         files['svalues']))[:self.modes]
        eofs_A = xr.open_dataarray(join(self.path,
                                        files['eofs_A']))[..., :self.modes]
        eofs_B = xr.open_dataarray(join(self.path,
                                        files['eofs_B']))[..., :self.modes]
        pcs_A = xr.open_dataarray(join(self.path,
                                       files['pcs_A']))[:, :self.modes]
        pcs_B = xr.open_dataarray(join(self.path,
                                       files['pcs_B']))[:, :self.modes]

        mca = xMCA(self.A, self.B)
        mca.set_field_names('sst', 'prcp')
        mca.solve()
        vals = mca.singular_values(self.modes)
        eofs = mca.eofs(self.modes)
        pcs = mca.pcs(self.modes)
        # fields = mca.reconstructed_fields()
        assert_allclose(svalues,
                        vals,
                        err_msg='svalues do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='eofs A do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='eofs B do not match',
                        **self.tols)
        assert_allclose(pcs_A,
                        pcs['left'],
                        err_msg='pcs A do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='pcs B do not match',
                        **self.tols)
        # assert_allclose(self.A, fields['left'], rtol=1e-3)
        # assert_allclose(self.B, fields['right'], rtol=1e-3, atol=9e-2)
        mca.plot(1)
        mca.save_analysis('./tests/integration')

        path = './tests/integration/xmca/sst_prcp/mca_c0_r00_p00.info'
        mca2 = xMCA()
        mca2.load_analysis(path)
        vals = mca2.singular_values(self.modes)
        eofs = mca2.eofs(self.modes)
        pcs = mca2.pcs(self.modes)
        # fields = mca2.reconstructed_fields()
        assert_allclose(svalues,
                        vals,
                        err_msg='singular values do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        # assert_allclose(
        #   self.A, fields['left'],
        #   err_msg='left reconstructed field does not match'
        # )
        # assert_allclose(
        #   self.B, fields['right'],
        #   err_msg='right reconstructed field does not match'
        # )

        rmtree(join(getcwd(), 'tests/integration/xmca/'))
    def test_complex_mca(self):
        files = {
            'svalues': 'mca_c1_r10_p01_singular_values.nc',
            'eofs_A': 'mca_c1_r10_p01_sst_eofs.nc',
            'eofs_B': 'mca_c1_r10_p01_prcp_eofs.nc',
            'pcs_A': 'mca_c1_r10_p01_sst_pcs.nc',
            'pcs_B': 'mca_c1_r10_p01_prcp_pcs.nc',
        }

        svalues = xr.open_dataarray(join(self.path, files['svalues']),
                                    engine='h5netcdf')[:self.modes]
        eofs_A = xr.open_dataarray(join(self.path, files['eofs_A']),
                                   engine='h5netcdf')[..., :self.modes]
        eofs_B = xr.open_dataarray(join(self.path, files['eofs_B']),
                                   engine='h5netcdf')[..., :self.modes]
        pcs_A = xr.open_dataarray(join(self.path, files['pcs_A']),
                                  engine='h5netcdf')[:, :self.modes]
        pcs_B = xr.open_dataarray(join(self.path, files['pcs_B']),
                                  engine='h5netcdf')[:, :self.modes]

        mca = xMCA(self.A, self.B)
        mca.set_field_names('sst', 'prcp')
        mca.solve(complexify=True, extend='theta', period=12)
        mca.rotate(10)
        vals = mca.singular_values(self.modes)
        eofs = mca.eofs(self.modes)
        pcs = mca.pcs(self.modes)

        assert_allclose(svalues,
                        vals,
                        err_msg='singular values do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        assert_allclose(pcs_A,
                        pcs['left'],
                        err_msg='left pcs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='right pcs do not match',
                        **self.tols)
        mca.plot(1)
        mca.save_analysis('./tests/integration')

        path = './tests/integration/xmca/sst_prcp/mca_c1_r10_p01.info'
        mca2 = xMCA()
        mca2.load_analysis(path)
        vals = mca2.singular_values(self.modes)
        eofs = mca2.eofs(self.modes)
        pcs = mca2.pcs(self.modes)

        assert_allclose(svalues,
                        vals,
                        err_msg='singular values do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        assert_allclose(pcs_A,
                        pcs['left'],
                        err_msg='left pcs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='right pcs do not match',
                        **self.tols)

        rmtree(join(getcwd(), 'tests/integration/xmca/'))

        @classmethod
        def tearDownClass(self):
            pass
    def test_rotated_mca(self):
        files = {
            'svalues': 'mca_c0_r10_p01_singular_values.nc',
            'eofs_A': 'mca_c0_r10_p01_sst_eofs.nc',
            'eofs_B': 'mca_c0_r10_p01_prcp_eofs.nc',
            'pcs_A': 'mca_c0_r10_p01_sst_pcs.nc',
            'pcs_B': 'mca_c0_r10_p01_prcp_pcs.nc',
        }

        svalues = xr.open_dataarray(join(self.path,
                                         files['svalues']))[:self.modes]
        eofs_A = xr.open_dataarray(join(self.path,
                                        files['eofs_A']))[..., :self.modes]
        eofs_B = xr.open_dataarray(join(self.path,
                                        files['eofs_B']))[..., :self.modes]
        pcs_A = xr.open_dataarray(join(self.path,
                                       files['pcs_A']))[:, :self.modes]
        pcs_B = xr.open_dataarray(join(self.path,
                                       files['pcs_B']))[:, :self.modes]

        mca = xMCA(self.A, self.B)
        mca.set_field_names('sst', 'prcp')
        mca.solve()
        mca.rotate(10)
        vals = mca.singular_values(self.modes)
        eofs = mca.eofs(self.modes)
        pcs = mca.pcs(self.modes)

        assert_allclose(svalues,
                        vals,
                        err_msg='singular values do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        assert_allclose(pcs_A,
                        pcs['left'],
                        err_msg='left pcs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='right pcs do not match',
                        **self.tols)
        mca.plot(1)
        mca.save_analysis('./tests/integration')

        path = './tests/integration/xmca/sst_prcp/mca_c0_r10_p01.info'
        mca2 = xMCA()
        mca2.load_analysis(path)
        vals = mca2.singular_values(self.modes)
        eofs = mca2.eofs(self.modes)
        pcs = mca2.pcs(self.modes)

        assert_allclose(svalues[:20],
                        vals[:20],
                        err_msg='singular values do not match',
                        **self.tols)
        assert_allclose(eofs_A,
                        eofs['left'],
                        err_msg='left eofs do not match',
                        **self.tols)
        assert_allclose(eofs_B,
                        eofs['right'],
                        err_msg='right eofs do not match',
                        **self.tols)
        assert_allclose(pcs_A,
                        pcs['left'],
                        err_msg='left pcs do not match',
                        **self.tols)
        assert_allclose(pcs_B,
                        pcs['right'],
                        err_msg='right pcs do not match',
                        **self.tols)

        rmtree(join(getcwd(), 'tests/integration/xmca/'))