def test_call(self):
        in_chs = ('a', 'b', 'c')
        out_chs = ('transformed_a', 'transformed_b')
        matrix = np.array([[1, -1, 0], [1, 1, 1]])
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        raw_data = (np.arange(12.) + 1).reshape((3, 4))
        data = dict(zip('abc', raw_data))

        data['ignored'] = np.arange(116., 120.)

        transformed = trafo(np.full(4, np.NaN), data)

        expected = {
            'transformed_a': data['a'] - data['b'],
            'transformed_b': np.sum(raw_data, axis=0),
            'ignored': np.arange(116., 120.)
        }

        np.testing.assert_equal(expected, transformed)

        data.pop('c')
        with self.assertRaisesRegex(KeyError, 'Invalid input channels'):

            trafo(np.full(4, np.NaN), data)

        in_chs = ('a', 'b', 'c')
        out_chs = ('a', 'b', 'c')
        matrix = np.eye(3)
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        data_in = {'ignored': np.arange(116., 120.)}
        transformed = trafo(np.full(4, np.NaN), data_in)
        np.testing.assert_equal(transformed, data_in)
        self.assertIs(data_in['ignored'], transformed['ignored'])
    def test_get_output_channels(self):
        in_chs = ('a', 'b', 'c')
        out_chs = ('transformed_a', 'transformed_b')
        matrix = np.array([[1, -1, 0], [1, 1, 1]])
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        self.assertEqual(trafo.get_output_channels({'a', 'b', 'c'}),
                         {'transformed_a', 'transformed_b'})
        with self.assertRaisesRegex(KeyError, 'Invalid input channels'):
            trafo.get_output_channels({'a', 'b'})
    def test_from_pandas(self):
        try:
            import pandas as pd
        except ImportError:
            raise unittest.SkipTest('pandas package not present')

        trafo_dict = {
            'transformed_a': {
                'a': 1,
                'b': -1,
                'c': 0
            },
            'transformed_b': {
                'a': 1,
                'b': 1,
                'c': 1
            }
        }
        trafo_df = pd.DataFrame(trafo_dict).T
        trafo = LinearTransformation.from_pandas(trafo_df)

        trafo_matrix = np.array([[1, -1, 0], [1, 1, 1]])

        self.assertEqual(trafo._input_channels, tuple('abc'))
        self.assertEqual(trafo._output_channels,
                         ('transformed_a', 'transformed_b'))
        np.testing.assert_equal(trafo_matrix, trafo._matrix)
    def test_scalar_trafo_works(self):
        in_chs = ('a', 'b', 'c')
        out_chs = ('transformed_a', 'transformed_b')
        matrix = np.array([[1, -1, 0], [1, 1, 1]])
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        assert_scalar_trafo_works(self, trafo, {'a': 0., 'b': 0.3, 'c': 0.6})
    def test_internal_create_program(self):
        template = DummyPulseTemplate(duration='t1', defined_channels={'X', 'Y'}, parameter_names={'a', 'b'},
                                      measurement_names={'M'}, waveform=DummyWaveform())
        overwritten_channels = {'Y': 'c', 'Z': 'a'}

        parent_loop = object()
        measurement_mapping = object()
        channel_mapping = object()
        to_single_waveform = object()

        other_kwargs = dict(measurement_mapping=measurement_mapping,
                            channel_mapping=channel_mapping,
                            to_single_waveform=to_single_waveform,
                            parent_loop=parent_loop)
        pccpt = ParallelConstantChannelPulseTemplate(template, overwritten_channels)

        scope = DictScope.from_kwargs(c=1.2, a=3.4)
        kwargs = {**other_kwargs, 'scope': scope, 'global_transformation': None}

        expected_overwritten_channels = {'Y': 1.2, 'Z': 3.4}
        expected_transformation = ParallelConstantChannelTransformation(expected_overwritten_channels)
        expected_kwargs = {**kwargs, 'global_transformation': expected_transformation}

        with mock.patch.object(template, '_create_program', spec=template._create_program) as cp_mock:
            pccpt._internal_create_program(**kwargs)
            cp_mock.assert_called_once_with(**expected_kwargs)

        global_transformation = LinearTransformation(numpy.zeros((0, 0)), [], [])
        expected_transformation = chain_transformations(global_transformation, expected_transformation)
        kwargs = {**other_kwargs, 'scope': scope, 'global_transformation': global_transformation}
        expected_kwargs = {**kwargs, 'global_transformation': expected_transformation}

        with mock.patch.object(template, '_create_program', spec=template._create_program) as cp_mock:
            pccpt._internal_create_program(**kwargs)
            cp_mock.assert_called_once_with(**expected_kwargs)
    def test_compare_key_and_init(self):
        in_chs = ('a', 'b', 'c')
        out_chs = ('transformed_a', 'transformed_b')
        matrix = np.array([[1, -1, 0], [1, 1, 1]])

        with self.assertRaisesRegex(ValueError, 'Shape'):
            LinearTransformation(matrix, in_chs[:-1], out_chs)
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        in_chs_2 = ('a', 'c', 'b')
        out_chs_2 = ('transformed_b', 'transformed_a')
        matrix_2 = np.array([[1, 1, 1], [1, 0, -1]])
        trafo_2 = LinearTransformation(matrix_2, in_chs_2, out_chs_2)

        self.assertEqual(trafo.compare_key, trafo_2.compare_key)
        self.assertEqual(trafo, trafo_2)
        self.assertEqual(hash(trafo), hash(trafo_2))
        self.assertEqual(trafo.compare_key,
                         (in_chs, out_chs, matrix.tobytes()))
Example #7
0
    def test_internal_create_program(self):
        template = DummyPulseTemplate(duration='t1',
                                      defined_channels={'X', 'Y'},
                                      parameter_names={'a', 'b'},
                                      measurement_names={'M'},
                                      waveform=DummyWaveform())
        overwritten_channels = {'Y': 'c', 'Z': 'a'}

        parent_loop = object()
        measurement_mapping = object()
        channel_mapping = object()
        to_single_waveform = object()

        other_kwargs = dict(measurement_mapping=measurement_mapping,
                            channel_mapping=channel_mapping,
                            to_single_waveform=to_single_waveform,
                            parent_loop=parent_loop)
        pccpt = ParallelConstantChannelPulseTemplate(template,
                                                     overwritten_channels)

        parameters = {'c': ConstantParameter(1.2), 'a': ConstantParameter(3.4)}
        kwargs = {
            **other_kwargs, 'parameters': parameters.copy(),
            'global_transformation': None
        }

        expected_overwritten_channels = {'Y': 1.2, 'Z': 3.4}
        expected_transformation = ParallelConstantChannelTransformation(
            expected_overwritten_channels)
        expected_kwargs = {
            **kwargs, 'global_transformation': expected_transformation
        }

        template._create_program = mock.Mock()
        pccpt._internal_create_program(**kwargs)
        template._create_program.assert_called_once_with(**expected_kwargs)

        global_transformation = LinearTransformation(numpy.zeros((0, 0)), [],
                                                     [])
        expected_transformation = chain_transformations(
            global_transformation, expected_transformation)
        kwargs = {
            **other_kwargs, 'parameters': parameters.copy(),
            'global_transformation': global_transformation
        }
        expected_kwargs = {
            **kwargs, 'global_transformation': expected_transformation
        }

        template._create_program = mock.Mock()
        pccpt._internal_create_program(**kwargs)
        template._create_program.assert_called_once_with(**expected_kwargs)
    def test_get_input_channels(self):
        in_chs = ('a', 'b', 'c')
        out_chs = ('transformed_a', 'transformed_b')
        matrix = np.array([[1, -1, 0], [1, 1, 1]])
        trafo = LinearTransformation(matrix, in_chs, out_chs)

        self.assertEqual(trafo.get_input_channels({'transformed_a'}),
                         {'a', 'b', 'c'})
        self.assertEqual(trafo.get_input_channels({'transformed_a', 'd'}),
                         {'a', 'b', 'c', 'd'})
        self.assertEqual(trafo.get_input_channels({'d'}), {'d'})
        with self.assertRaisesRegex(KeyError, 'Is input channel'):
            self.assertEqual(trafo.get_input_channels({'transformed_a', 'a'}),
                             {'a', 'b', 'c', 'd'})

        in_chs = ('a', 'b', 'c')
        out_chs = ('a', 'b', 'c')
        matrix = np.eye(3)

        trafo = LinearTransformation(matrix, in_chs, out_chs)
        in_set = {'transformed_a'}
        self.assertIs(trafo.get_input_channels(in_set), in_set)
        self.assertEqual(trafo.get_input_channels({'transformed_a', 'a'}),
                         {'transformed_a', 'a', 'b', 'c'})
 def test_constant_propagation(self):
     in_chs = ('a', 'b', 'c')
     out_chs = ('transformed_a', 'transformed_b')
     matrix = np.array([[1, -1, 0], [1, 1, 1]])
     trafo = LinearTransformation(matrix, in_chs, out_chs)
     self.assertTrue(trafo.is_constant_invariant())
 def test_repr(self):
     in_chs = ('a', 'b', 'c')
     out_chs = ('transformed_a', 'transformed_b')
     matrix = np.array([[1, -1, 0], [1, 1, 1]])
     trafo = LinearTransformation(matrix, in_chs, out_chs)
     self.assertEqual(trafo, eval(repr(trafo)))