示例#1
0
    def test_update_volatile_parameters_with_depth1(self):
        parameters = {'s': 10, 'not': 13}
        s = VolatileRepetitionCount(expression=ExpressionScalar('s'),
                                    scope=DictScope(values=FrozenDict(s=3),
                                                    volatile=set('s')))

        wf_1 = DummyWaveform(defined_channels={'A'}, duration=1)
        wf_2 = DummyWaveform(defined_channels={'A'}, duration=1)

        program = Loop(children=[
            Loop(waveform=wf_1, repetition_count=s),
            Loop(waveform=wf_2, repetition_count=4),
            Loop(waveform=wf_1, repetition_count=1)
        ],
                       repetition_count=1)

        t_program = TaborProgram(program,
                                 channels=(None, 'A'),
                                 markers=(None, None),
                                 device_properties=self.instr_props,
                                 **self.program_entry_kwargs)

        self.assertEqual(t_program.get_sequencer_tables(),
                         [[(TableDescription(3, 0, 0), s.volatile_property),
                           (TableDescription(4, 1, 0), None),
                           (TableDescription(1, 0, 0), None)]])
        self.assertEqual(t_program.get_advanced_sequencer_table(),
                         [TableDescription(1, 1, 0)])

        modifications = t_program.update_volatile_parameters(parameters)

        expected_seq = VolatileRepetitionCount(
            expression=ExpressionScalar('s'),
            scope=DictScope(values=FrozenDict(s=10), volatile=set('s')))
        expected_modifications = {(0, 0): TableDescription(10, 0, 0)}

        self.assertEqual(
            t_program.get_sequencer_tables(),
            [[(TableDescription(10, 0, 0), expected_seq.volatile_property),
              (TableDescription(4, 1, 0), None),
              (TableDescription(1, 0, 0), None)]])
        self.assertEqual(t_program.get_advanced_sequencer_table(),
                         [TableDescription(1, 1, 0)])
        self.assertEqual(modifications, expected_modifications)
示例#2
0
    def test_is_compatible_warnings(self):
        wf = DummyWaveform(duration=1)
        volatile_repetition_count = VolatileRepetitionCount(ExpressionScalar('x'),
                                                            DictScope.from_kwargs(x=3, volatile={'x'}))

        volatile_leaf = Loop(waveform=wf, repetition_count=volatile_repetition_count)
        with self.assertWarns(VolatileModificationWarning):
            self.assertEqual(_CompatibilityLevel.action_required, _is_compatible(volatile_leaf, min_len=3, quantum=1,
                                                                                 sample_rate=time_from_float(1.)))

        volatile_node = Loop(children=[Loop(waveform=wf)], repetition_count=volatile_repetition_count)
        with self.assertWarns(VolatileModificationWarning):
            self.assertEqual(_CompatibilityLevel.action_required, _is_compatible(volatile_node, min_len=3, quantum=1,
                                                                                 sample_rate=time_from_float(1.)))
示例#3
0
def complex_program_as_loop(unique_wfs, wf_same):
    root = Loop(repetition_count=12)

    for wf_unique in unique_wfs:
        root.append_child(children=[
            Loop(repetition_count=42, waveform=wf_unique),
            Loop(repetition_count=98, waveform=wf_same)
        ],
                          repetition_count=10)

    root.append_child(waveform=unique_wfs[0], repetition_count=21)
    root.append_child(waveform=wf_same, repetition_count=23)

    volatile_repetition = VolatileRepetitionCount(
        ExpressionScalar('n + 4'), DictScope.from_kwargs(n=3, volatile={'n'}))
    root.append_child(waveform=wf_same, repetition_count=volatile_repetition)

    return root
示例#4
0
文件: _loop.py 项目: zea2/qupulse
    def _merge_single_child(self):
        """Lift the single child to current level. Requires _has_single_child_that_can_be_merged to be true"""
        assert len(
            self) == 1, "bug: _merge_single_child called on loop with len != 1"
        child = cast(Loop, self[0])

        # if the child has a fixed repetition count of 1 the measurements can be merged
        mergable_measurements = child.repetition_count == 1 and not child.volatile_repetition

        assert not self._measurements or mergable_measurements, "bug: _merge_single_child called on loop with measurements"
        assert not self._waveform, "bug: _merge_single_child called on loop with children and waveform"

        measurements = child._measurements
        if self._measurements:
            if measurements:
                measurements.extend(self._measurements)
            else:
                measurements = self._measurements

        if not self.volatile_repetition and not child.volatile_repetition:
            # simple integer multiplication
            repetition_definition = self.repetition_count * child.repetition_count
        elif not self.volatile_repetition:
            repetition_definition = child._repetition_definition * self.repetition_count
        elif not child.volatile_repetition:
            repetition_definition = self._repetition_definition * child.repetition_count
        else:
            # create a new expression that depends on both
            expression = 'parent_repetition_count * child_repetition_count'
            repetition_definition = VolatileRepetitionCount.operation(
                expression=expression,
                parent_repetition_count=self._repetition_definition,
                child_repetition_count=child._repetition_definition)

        self[:] = iter(child)
        self._waveform = child._waveform
        self._repetition_definition = repetition_definition
        self._measurements = measurements
        self._invalidate_duration()
        return True
示例#5
0
    def test_roll_constant_waveforms(self):
        root = Loop(waveform=ConstantWaveform.from_mapping(
            16, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=4)
        expected = copy.deepcopy(root)
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        root = Loop(waveform=ConstantWaveform.from_mapping(
            32, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=4)
        expected = Loop(waveform=ConstantWaveform.from_mapping(
            16, {
                'A': 1.,
                'B': 0.5
            }),
                        repetition_count=8)
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        root = Loop(waveform=ConstantWaveform.from_mapping(
            16 * 3, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=4)
        expected = Loop(waveform=ConstantWaveform.from_mapping(
            16, {
                'A': 1.,
                'B': 0.5
            }),
                        repetition_count=12)
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        root = Loop(waveform=ConstantWaveform.from_mapping(
            16 * 3, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=4)
        expected = copy.deepcopy(root)
        roll_constant_waveforms(root, 2, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        root = Loop(waveform=ConstantWaveform.from_mapping(
            16 * 5, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=4)
        expected = copy.deepcopy(root)
        roll_constant_waveforms(root, 2, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        root = Loop(children=[
            Loop(waveform=ConstantWaveform.from_mapping(
                32, {
                    'A': 1.,
                    'B': 0.5
                }),
                 repetition_count=4),
            Loop(waveform=ConstantWaveform.from_mapping(
                16, {
                    'A': 1.,
                    'B': 0.3
                }),
                 repetition_count=4),
            Loop(waveform=ConstantWaveform.from_mapping(
                128, {
                    'A': .1,
                    'B': 0.5
                }),
                 repetition_count=2)
        ])
        expected = Loop(children=[
            Loop(waveform=ConstantWaveform.from_mapping(
                16, {
                    'A': 1.,
                    'B': 0.5
                }),
                 repetition_count=8),
            Loop(waveform=ConstantWaveform.from_mapping(
                16, {
                    'A': 1.,
                    'B': 0.3
                }),
                 repetition_count=4),
            Loop(waveform=ConstantWaveform.from_mapping(
                16, {
                    'A': .1,
                    'B': 0.5
                }),
                 repetition_count=2 * 128 // 16)
        ])
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        not_constant_wf = DummyWaveform(sample_output=np.array([.1, .2, .3]),
                                        duration=TimeType.from_fraction(32, 1),
                                        defined_channels={'A', 'B'})

        root = Loop(waveform=not_constant_wf, repetition_count=4)
        expected = copy.deepcopy(root)
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)

        scope = DictScope.from_mapping({'a': 4, 'b': 3}, volatile={'a'})
        rep_count = VolatileRepetitionCount(expression=ExpressionScalar('a+b'),
                                            scope=scope)
        root = Loop(waveform=ConstantWaveform.from_mapping(
            32, {
                'A': 1.,
                'B': 0.5
            }),
                    repetition_count=rep_count)
        expected = Loop(waveform=ConstantWaveform.from_mapping(
            16, {
                'A': 1.,
                'B': 0.5
            }),
                        repetition_count=rep_count * 2)
        self.assertNotEqual(root.repetition_count, expected.repetition_count)
        roll_constant_waveforms(root, 1, 16, TimeType.from_fraction(1, 1))
        self.assertEqual(root, expected)