class BenchmarkCompilation(object): def setup(self): self.root = RootSequence() self.context = AWGContext() self.root.context = self.context def benchmark_sequence_compilation1(self): # Test compiling a flat sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{a}') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) assert_true(self.root.compile_sequence()[0]) print 'Sequence 1', time(partial(self.root.compile_sequence)) def benchmark_sequence_compilation2(self): # Test compiling a flat sequence of fixed duration. self.root.external_vars = {'a': 1.5} self.root.fix_sequence_duration = True self.root.sequence_duration = '10.0' pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{a}') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{2_stop} + 0.5', def_2='{sequence_end}') self.root.items.extend([pulse1, pulse2, pulse3]) assert_true(self.root.compile_sequence()[0]) print 'Sequence 2', time(partial(self.root.compile_sequence)) def benchmark_sequence_compilation3(self): # Test compiling a flat sequence in two passes. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{2_start} - 1.0') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) assert_true(self.root.compile_sequence()[0]) print 'Sequence 3', time(partial(self.root.compile_sequence)) def benchmark_sequence_compilation7(self): # Test compiling a nested sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{a}') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch1_M1', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch1_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] assert_true(self.root.compile_sequence()[0]) print 'Sequence 7', time(partial(self.root.compile_sequence)) def benchmark_sequence_compilation8(self): # Test compiling a nested sequence in two passes on the external # sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch1_M1', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch1_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] assert_true(self.root.compile_sequence()[0]) print 'Sequence 8', time(partial(self.root.compile_sequence)) def benchmark_sequence_compilation9(self): # Test compiling a nested sequence in multi passes. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='{6_start} + 1.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch1_M1', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch1_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] assert_true(self.root.compile_sequence()[0]) print 'Sequence 9', time(partial(self.root.compile_sequence)) def benchmark_conditional_sequence_compilation1(self): # Test compiling a conditional sequence whose condition evaluates to # False. self.root.external_vars = {'a': 1.5, 'include': True} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch1_M1', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch1_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = ConditionalSequence(items=[pulse2, sequence2, pulse4], condition='{include}') self.root.items = [pulse1, sequence1, pulse5] assert_true(self.root.compile_sequence()[0]) print 'Conditional seq 1', time(partial(self.root.compile_sequence)) def benchmark_conditional_sequence_compilation2(self): # Test compiling a conditional sequence whose condition evaluates to # True. self.root.external_vars = {'a': 1.5, 'include': False} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(channel='Ch1_M1', def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(channel='Ch1_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch1_M1', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch1_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = ConditionalSequence(items=[pulse2, sequence2, pulse4], condition='{include}') self.root.items = [pulse1, sequence1, pulse5] assert_true(self.root.compile_sequence()[0]) print 'Conditional seq 2', time(partial(self.root.compile_sequence))
class TestAWGContext(object): """ """ def setup(self): self.root = RootSequence() self.context = AWGContext() self.root.context = self.context def test_compiling_A_pulse(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse = Pulse(kind='Analogical', shape=SquareShape(amplitude='1.0'), def_1='0.1', def_2='0.5', channel='Ch1_A') self.root.items = [pulse] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) assert_equal(len(arrays), 1) sequence = np.zeros(2000, dtype=np.uint8) sequence[1::2] = 2**5 sequence[201:1001:2] += 2**4 + 2**3 + 4 + 2 + 1 sequence[200:1000:2] += 255 assert_sequence_equal(arrays[1], bytearray(sequence)) def test_compiling_M1_pulse(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M1') self.root.items = [pulse] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) sequence = np.zeros(2000, dtype=np.uint8) sequence[1::2] = 2**5 sequence[201:1001:2] += 2**6 assert_sequence_equal(arrays[1], bytearray(sequence)) def test_compiling_M2_pulse(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M2') self.root.items = [pulse] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) def test_compiling_inverted_logical_pulses(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M2') self.root.items = [pulse] self.context.inverted_log_channels = ['Ch1_M1', 'Ch1_M2'] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) sequence = np.zeros(2000, dtype=np.uint8) sequence[1::2] = 2**7 + 2**6 + 2**5 sequence[201:1001:2] -= 2**7 assert_sequence_equal(arrays[1], bytearray(sequence)) def test_compiling_variable_length(self): pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M1') self.root.items = [pulse] self.context.sampling_frequency = 1e8 res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) sequence = np.zeros(100, dtype=np.uint8) sequence[1::2] = 2**5 sequence[21:101:2] += 2**6 assert_sequence_equal(arrays[1], bytearray(sequence)) def test_too_short_fixed_length(self): self.root.time_constrained = True self.root.sequence_duration = '0.3' pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M1') self.root.items = [pulse] res, traceback = self.root.compile_sequence() assert_false(res) def test_channel_kind_mixing(self): self.root.time_constrained = True self.root.sequence_duration = '0.3' pulse = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_A') self.root.items = [pulse] res, traceback = self.root.compile_sequence() assert_false(res) def test_overlapping_pulses(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse1 = Pulse(kind='Analogical', def_1='0.1', def_2='0.5', channel='Ch1_A', shape=SquareShape(amplitude='1.0'), modulation=Modulation(frequency='2.5', kind='sin', activated=True)) pulse2 = Pulse(kind='Analogical', def_1='0.1', def_2='0.5', channel='Ch1_A', shape=SquareShape(amplitude='1.0'), modulation=Modulation(frequency='2.5', kind='sin', phase='Pi', activated=True)) self.root.items = [pulse1, pulse2] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) def test_nearly_overlapping_M2(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse1 = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M2') pulse2 = Pulse(kind='Logical', def_1='0.5', def_2='0.6', channel='Ch1_M2') self.root.items = [pulse1, pulse2] res, arrays = self.root.compile_sequence() assert_true(res) assert_in(1, arrays) sequence = np.zeros(2000, dtype=np.uint8) sequence[1::2] = 2**5 sequence[201:1201:2] += 2**7 assert_sequence_equal(arrays[1], bytearray(sequence)) def test_overflow_check_A(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse1 = Pulse(kind='Analogical', def_1='0.1', def_2='0.5', channel='Ch1_A', shape=SquareShape(amplitude='1.0'), modulation=Modulation(frequency='2.5', kind='sin', activated=True)) pulse2 = Pulse(kind='Analogical', def_1='0.1', def_2='0.5', channel='Ch1_A', shape=SquareShape(amplitude='1.0'), modulation=Modulation(frequency='2.5', kind='sin', activated=True)) self.root.items = [pulse1, pulse2] res, traceback = self.root.compile_sequence() assert_false(res) assert_in('Ch1_A', traceback) def test_overflow_check_M1(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse1 = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M1') pulse2 = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M1') self.root.items = [pulse1, pulse2] res, traceback = self.root.compile_sequence() assert_false(res) assert_in('Ch1_M1', traceback) def test_overflow_check_M2(self): self.root.time_constrained = True self.root.sequence_duration = '1' pulse1 = Pulse(kind='Logical', def_1='0.1', def_2='0.5', channel='Ch1_M2') pulse2 = Pulse(kind='Logical', def_1='0.4', def_2='0.6', channel='Ch1_M2') self.root.items = [pulse1, pulse2] res, traceback = self.root.compile_sequence() assert_false(res) assert_in('Ch1_M2', traceback) def test_compiling_sequence1(self): self.root.external_vars = {'a': 1.5} pulse1 = Pulse(channel='Ch1_M1', def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(channel='Ch1_M2', def_1='{a} + 1.0', def_2='{6_start} + 1.0') pulse3 = Pulse(channel='Ch2_M1', def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(channel='Ch2_M2', def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(channel='Ch3_M1', def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, arrays = self.root.compile_sequence() assert_true(res) assert_equal(len(arrays), 3) assert_equal(sorted(arrays.keys()), sorted([1, 2, 3]))
class TestCompilation(object): def setup(self): self.root = RootSequence() self.context = TestContext(sampling=0.5) self.root.context = self.context def test_sequence_compilation1(self): # Test compiling a flat sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 3) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) def test_sequence_compilation1bis(self): # Compiles two times a sequence while changing a parameter to make # sure the cache is cleaned in between self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='4.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 3) assert_equal(pulses[0].stop, 1.5) self.root.external_vars = {'a': 2.} res, pulses = self.root.compile_sequence(False) print res, pulses, pulse1.stop assert_true(res) assert_equal(len(pulses), 3) assert_equal(pulses[0].stop, 2.) def test_sequence_compilation2(self): # Test compiling a flat sequence of fixed duration. self.root.external_vars = {'a': 1.5} self.root.time_constrained = True self.root.sequence_duration = '10.0' pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='{sequence_end}') self.root.items.extend([pulse1, pulse2, pulse3]) res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 3) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) def test_sequence_compilation3(self): # Test compiling a flat sequence in two passes. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{2_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 3) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) def test_sequence_compilation4(self): # Test compiling a flat sequence with circular references. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{2_start} - 1.0') pulse2 = Pulse(def_1='{1_stop} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10') self.root.items.extend([pulse1, pulse2, pulse3]) res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(missings), 2) assert_in('1_stop', missings) assert_in('2_start', missings) assert_equal(len(errors), 0) def test_sequence_compilation5(self): # Test compiling a flat sequence with evaluation errors. # missing global self.root.time_constrained = True self.root.sequence_duration = '10.0' pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='{sequence_end}') self.root.items.extend([pulse1, pulse2, pulse3]) res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(missings), 1) assert_in('a', missings) assert_equal(len(errors), 0) def test_sequence_compilation6(self): # Test compiling a flat sequence with evaluation errors. # wrong string value self.root.external_vars = {'a': 1.5} self.root.time_constrained = True self.root.sequence_duration = '*10.0*' pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} +* 1.0', def_2='3.0') pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10.0') self.root.items.extend([pulse1, pulse2, pulse3]) res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(missings) assert_equal(len(errors), 2) assert_in('2_start', errors) assert_in('root_seq_duration', errors) def test_sequence_compilation7(self): # Test compiling a nested sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_sequence_compilation8(self): # Test compiling a nested sequence in two passes on the external # sequence. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 2.0) assert_equal(pulses[0].duration, 1.0) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_sequence_compilation9(self): # Test compiling a nested sequence in multi passes. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='{6_start} + 1.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 2.0) assert_equal(pulses[0].duration, 1.0) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_sequence_compilation10(self): # Test compiling a nested sequence with circular reference in the deep # one. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='{6_start} + 1.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='{1_stop}', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(missings), 2) assert_in('7_start', missings) assert_in('1_stop', missings) assert_false(errors) def test_sequence_compilation11(self): # Test compiling a nested sequence with circular reference in the deep # one. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='{6_start} + 1.0') pulse3 = Pulse(def_1='{3_stop} + *0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(errors), 1) assert_in('5_start', errors) def test_sequence_compilation12(self): # Test compiling a nested sequence using local vars. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='{b}') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], local_vars={'b': '2**2'}) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 4) assert_equal(pulses[2].duration, 0.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_sequence_compilation13(self): # Test compiling a nested sequence with wrong local vars definitions. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='{b}') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], local_vars={'b': '2**2*'}) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(missings), 1) assert_in('b', missings) assert_in('4_b', errors) def test_sequence_compilation14(self): # Test the locality of local vars. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='{b}') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='{b}', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], local_vars={'b': '2**2'}) sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_equal(len(missings), 1) assert_in('b', missings) assert_false(errors) # Here I don't test the evaluation errors on the defs as this is handled # at the Item level and tested in TestPulse. def test_sequence_compilation15(self): # Test compiling a nested sequence with internal fixed length. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{4_start} + 0.5', def_2='{4_start}+{4_duration}-0.5') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], time_constrained=True, def_1='{3_stop} + 0.5', def_2='6') sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 1.5) assert_equal(pulses[0].duration, 0.5) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 4) assert_equal(pulses[2].stop, 5.5) assert_equal(pulses[2].duration, 1.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_sequence_compilation16(self): # Test compiling a nested sequence with internal fixed length but # incoherent pulse start. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{4_start} - 0.5', def_2='{4_start}+{4_duration}-0.5') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], time_constrained=True, def_1='{3_stop} + 0.5', def_2='6', name='test') sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(missings) assert_in('test-start', errors) def test_sequence_compilation17(self): # Test compiling a nested sequence with internal fixed length but # incoherent pulse stop. self.root.external_vars = {'a': 1.5} pulse1 = Pulse(def_1='1.0', def_2='{a}') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{4_start} + 0.5', def_2='{4_start}+{4_duration}+0.5') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3], time_constrained=True, def_1='{3_stop} + 0.5', def_2='6', name='test') sequence1 = Sequence(items=[pulse2, sequence2, pulse4]) self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(missings) assert_in('test-stop', errors) def test_conditional_sequence_compilation1(self): # Test compiling a conditional sequence whose condition evaluates to # False. self.root.external_vars = {'a': 1.5, 'include': True} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = ConditionalSequence(items=[pulse2, sequence2, pulse4], condition='{include}') self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 5) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 2.0) assert_equal(pulses[0].duration, 1.0) assert_is(pulses[1], pulse2) assert_equal(pulses[1].start, 2.5) assert_equal(pulses[1].stop, 3.0) assert_equal(pulses[1].duration, 0.5) assert_is(pulses[2], pulse3) assert_equal(pulses[2].start, 3.5) assert_equal(pulses[2].stop, 10.0) assert_equal(pulses[2].duration, 6.5) assert_is(pulses[3], pulse4) assert_equal(pulses[3].start, 2.0) assert_equal(pulses[3].stop, 2.5) assert_equal(pulses[3].duration, 0.5) assert_is(pulses[4], pulse5) assert_equal(pulses[4].start, 3.0) assert_equal(pulses[4].stop, 3.5) assert_equal(pulses[4].duration, 0.5) def test_conditional_sequence_compilation2(self): # Test compiling a conditional sequence whose condition evaluates to # True. self.root.external_vars = {'a': 1.5, 'include': False} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = ConditionalSequence(items=[pulse2, sequence2, pulse4], condition='{include}') self.root.items = [pulse1, sequence1, pulse5] res, pulses = self.root.compile_sequence(False) assert_true(res) assert_equal(len(pulses), 2) assert_is(pulses[0], pulse1) assert_equal(pulses[0].start, 1.0) assert_equal(pulses[0].stop, 2.0) assert_equal(pulses[0].duration, 1.0) assert_is(pulses[1], pulse5) assert_equal(pulses[1].start, 3.0) assert_equal(pulses[1].stop, 3.5) assert_equal(pulses[1].duration, 0.5) def test_conditional_sequence_compilation3(self): # Test compiling a conditional sequence with a wrong condition. self.root.external_vars = {'a': 1.5, 'include': False} pulse1 = Pulse(def_1='1.0', def_2='{7_start} - 1.0') pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0') pulse3 = Pulse(def_1='{3_stop} + 0.5', def_2='10.0') pulse4 = Pulse(def_1='2.0', def_2='0.5', def_mode='Start/Duration') pulse5 = Pulse(def_1='3.0', def_2='0.5', def_mode='Start/Duration') sequence2 = Sequence(items=[pulse3]) sequence1 = ConditionalSequence(items=[pulse2, sequence2, pulse4], condition='{include}*/') self.root.items = [pulse1, sequence1, pulse5] res, (missings, errors) = self.root.compile_sequence(False) assert_false(res) assert_in('2_condition', errors)
class TestCompilation(object): def setup(self): pref = create_template_sequence() conf = ConfigObj() conf.update(pref) dep = {'Sequence': Sequence, 'Pulse': Pulse, 'TemplateSequence': TemplateSequence, 'shapes': {'SquareShape': SquareShape}, 'contexts': {'TemplateContext': TemplateContext, 'TestContext': TestContext}, 'templates': {'test': ('', conf, 'Basic user comment\nff')}} self.dependecies = {'pulses': dep} self.root = RootSequence() self.context = TestContext(sampling=0.5) self.root.context = self.context conf = {'template_id': 'test', 'name': 'Template', 'template_vars': "{'b': '19'}"} seq = TemplateSequence.build_from_config(conf, self.dependecies) seq.context.channel_mapping = {'A': 'Ch1_L', 'B': 'Ch2_L', 'Ch1': 'Ch2_A', 'Ch2': 'Ch1_A'} seq.def_1 = '1.0' seq.def_2 = '20.0' self.template = seq self.root.items = [seq] def test_sequence_compilation1(self): # Test compiling a template when everything is ok. res, pulses = self.root.compile_sequence(False) assert_true(res, '{}'.format(pulses)) assert_equal(len(pulses), 4) pulse = pulses[0] assert_equal(pulse.index, 1) assert_equal(pulse.start, 2.0) assert_equal(pulse.stop, 2.5) assert_equal(pulse.duration, 0.5) assert_equal(pulse.channel, 'Ch1_L') pulse = pulses[1] assert_equal(pulse.index, 2) assert_equal(pulse.start, 3.5) assert_equal(pulse.stop, 4) assert_equal(pulse.duration, 0.5) assert_equal(pulse.channel, 'Ch2_L') pulse = pulses[2] assert_equal(pulse.index, 4) assert_equal(pulse.start, 4.5) assert_equal(pulse.stop, 20) assert_equal(pulse.duration, 15.5) assert_equal(pulse.channel, 'Ch1_A') pulse = pulses[3] assert_equal(pulse.index, 5) assert_equal(pulse.start, 4.5) assert_equal(pulse.stop, 20) assert_equal(pulse.duration, 15.5) assert_equal(pulse.channel, 'Ch2_A') def test_sequence_compilation2(self): # Test compiling a template : issue in context, incomplete mapping. self.template.context.channel_mapping = {'A': 'Ch1_L', 'B': 'Ch2_L', 'Ch1': 'Ch2_A'} res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(miss) assert_in('Template-context', errors) assert_in('Ch2', errors['Template-context']) def test_sequence_compilation3(self): # Test compiling a template : issue in context, erroneous mapping. self.template.context.channel_mapping = {'A': 'Ch1_L', 'B': 'Ch2_L', 'Ch1': 'Ch2_A', 'Ch2': 'A'} res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(miss) assert_in('Template-context', errors) assert_in('Ch2', errors['Template-context']) def test_sequence_compilation3bis(self): # Test compiling a template : pulse as umapped channel. self.template.items[0].channel = '__' res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(miss) assert_in('Template-channels', errors) assert_in('__', errors['Template-channels']) def test_sequence_compilation4(self): # Test compiling a template : issue in defs. self.template.def_1 = 'r*' res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_false(miss) assert_in('1_start', errors) def test_sequence_compilation5(self): # Test compiling a template : issue in template_vars. self.template.template_vars = {'b': '*1'} res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_in('1_b', errors) def test_sequence_compilation6(self): # Test compiling a template : issue in local_vars. self.template.local_vars = {'a': '*1'} res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_in('1_a', errors) def test_sequence_compilation7(self): # Test compiling a template : issue in stop time. self.template.items[0].def_2 = '200' res, (miss, errors) = self.root.compile_sequence(False) assert_false(res) assert_in('Template-stop', errors)