def test_replace_instruction_by_block(self): """Test replacing instruction with block.""" sub_block1 = pulse.ScheduleBlock() sub_block1 = sub_block1.append(pulse.Delay(50, self.d0)) sub_block1 = sub_block1.append(pulse.Play(self.test_waveform0, self.d0)) sub_block2 = pulse.ScheduleBlock() sub_block2 = sub_block2.append(pulse.Delay(50, self.d0)) sub_block2 = sub_block2.append(pulse.Play(self.test_waveform1, self.d1)) main_block = pulse.ScheduleBlock() main_block = main_block.append(pulse.Delay(50, self.d0)) main_block = main_block.append(pulse.Play(self.test_waveform0, self.d0)) main_block = main_block.append(pulse.Delay(100, self.d0)) main_block = main_block.append(sub_block2) main_block = main_block.append(pulse.Play(self.test_waveform0, self.d1)) replaced = main_block.replace(pulse.Delay(100, self.d0), sub_block1) ref_blocks = [ pulse.Delay(50, self.d0), pulse.Play(self.test_waveform0, self.d0), sub_block1, sub_block2, pulse.Play(self.test_waveform0, self.d1), ] self.assertListEqual(list(replaced.blocks), ref_blocks)
def test_different_channels(self): """Test equality is False if different channels.""" block1 = pulse.ScheduleBlock() block1 += pulse.Delay(10, self.d0) block2 = pulse.ScheduleBlock() block2 += pulse.Delay(10, self.d1) self.assertNotEqual(block1, block2)
def test_different_transform(self): """Test equality is False if different transforms.""" block1 = pulse.ScheduleBlock(alignment_context=self.left_context) block1 += pulse.Delay(10, self.d0) block2 = pulse.ScheduleBlock(alignment_context=self.right_context) block2 += pulse.Delay(10, self.d0) self.assertNotEqual(block1, block2)
def test_append_a_block_to_empty_block(self): """Test append another ScheduleBlock to empty block.""" block = pulse.ScheduleBlock() block.append(pulse.Play(self.test_waveform0, self.d0), inplace=True) block_main = pulse.ScheduleBlock() block_main = block_main.append(block) self.assertEqual(block_main.blocks[0], block)
def test_instruction_out_of_order_equispaced(self): """Test equality is False if two blocks have instructions in different order.""" block1 = pulse.ScheduleBlock(alignment_context=self.equispaced_context) block1 += pulse.Play(self.test_waveform0, self.d0) block1 += pulse.Play(self.test_waveform0, self.d1) block2 = pulse.ScheduleBlock(alignment_context=self.equispaced_context) block2 += pulse.Play(self.test_waveform0, self.d1) block2 += pulse.Play(self.test_waveform0, self.d0) self.assertNotEqual(block1, block2)
def test_instrution_in_oder_but_different_node(self): """Test equality is False if two blocks have different instructions.""" block1 = pulse.ScheduleBlock(alignment_context=self.left_context) block1 += pulse.Play(self.test_waveform0, self.d0) block1 += pulse.Play(self.test_waveform1, self.d1) block2 = pulse.ScheduleBlock(alignment_context=self.left_context) block2 += pulse.Play(self.test_waveform0, self.d0) block2 += pulse.Play(self.test_waveform0, self.d1) self.assertNotEqual(block1, block2)
def test_instruction_in_order_func(self): """Test equality is True if two blocks have instructions in same order.""" block1 = pulse.ScheduleBlock(alignment_context=self.func_context) block1 += pulse.Play(self.test_waveform0, self.d0) block1 += pulse.Play(self.test_waveform0, self.d1) block2 = pulse.ScheduleBlock(alignment_context=self.func_context) block2 += pulse.Play(self.test_waveform0, self.d0) block2 += pulse.Play(self.test_waveform0, self.d1) self.assertEqual(block1, block2)
def test_different_transform_opts(self): """Test equality is False if different transform options.""" context1 = transforms.AlignEquispaced(duration=100) context2 = transforms.AlignEquispaced(duration=500) block1 = pulse.ScheduleBlock(alignment_context=context1) block1 += pulse.Delay(10, self.d0) block2 = pulse.ScheduleBlock(alignment_context=context2) block2 += pulse.Delay(10, self.d0) self.assertNotEqual(block1, block2)
def test_set_parameter_to_complex_schedule(self): """Test get parameters from complicated schedule.""" test_block = deepcopy(self.test_sched) value_dict = { self.amp1_1: 0.1, self.amp1_2: 0.2, self.amp2: 0.3, self.amp3: 0.4, self.dur1: 100, self.dur2: 125, self.dur3: 150, self.ch1: 0, self.ch2: 2, self.ch3: 4, self.phi1: 1.0, self.phi2: 2.0, self.phi3: 3.0, self.meas_dur: 300, self.mem1: 3, self.reg1: 0, self.context_dur: 1000, } visitor = ParameterSetter(param_map=value_dict) assigned = visitor.visit(test_block) # create ref schedule subroutine = pulse.ScheduleBlock(alignment_context=AlignLeft()) subroutine += pulse.ShiftPhase(1.0, pulse.DriveChannel(0)) subroutine += pulse.Play(pulse.Gaussian(100, 0.3, 25), pulse.DriveChannel(0)) sched = pulse.Schedule() sched += pulse.ShiftPhase(3.0, pulse.DriveChannel(4)) ref_obj = pulse.ScheduleBlock(alignment_context=AlignEquispaced(1000), name="long_schedule") ref_obj += subroutine ref_obj += pulse.ShiftPhase(2.0, pulse.DriveChannel(2)) ref_obj += pulse.Play(pulse.Gaussian(125, 0.3, 25), pulse.DriveChannel(2)) ref_obj += pulse.Call(sched) ref_obj += pulse.Play(pulse.Gaussian(150, 0.4, 25), pulse.DriveChannel(4)) ref_obj += pulse.Acquire(300, pulse.AcquireChannel(0), pulse.MemorySlot(3), pulse.RegisterSlot(0)) self.assertEqual(assigned, ref_obj)
def test_instructions(self): """Test if all instructions are returned.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(block.blocks, tuple(self.test_blocks))
def test_stop_time(self): """Test if correct schedule stop time is returned with implicit scheduling.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(block.stop_time, 350)
def test_duration(self): """Test if correct duration is returned with implicit scheduling.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(block.duration, 350)
def test_append_an_instruction_to_empty_block_inplace(self): """Test append instructions to an empty block with inplace.""" block = pulse.ScheduleBlock() block.append(pulse.Play(self.test_waveform0, self.d0), inplace=True) self.assertEqual(block.blocks[0], pulse.Play(self.test_waveform0, self.d0))
def test_append_an_instruction_to_empty_block_sugar(self): """Test append instructions to an empty block with syntax sugar.""" block = pulse.ScheduleBlock() block += pulse.Play(self.test_waveform0, self.d0) self.assertEqual(block.blocks[0], pulse.Play(self.test_waveform0, self.d0))
def test_parametrized_context(self): """Test parametrize context parameter.""" duration = circuit.Parameter('dur') param_context = transforms.AlignEquispaced(duration=duration) block = pulse.ScheduleBlock(alignment_context=param_context) block += pulse.Delay(10, self.d0) block += pulse.Delay(10, self.d0) block += pulse.Delay(10, self.d0) block += pulse.Delay(10, self.d0) self.assertTrue(block.is_parameterized()) self.assertFalse(block.is_schedulable()) block.assign_parameters({duration: 100}, inplace=True) self.assertFalse(block.is_parameterized()) self.assertTrue(block.is_schedulable()) ref_sched = pulse.Schedule() ref_sched = ref_sched.insert(0, pulse.Delay(10, self.d0)) ref_sched = ref_sched.insert(10, pulse.Delay(20, self.d0)) ref_sched = ref_sched.insert(30, pulse.Delay(10, self.d0)) ref_sched = ref_sched.insert(40, pulse.Delay(20, self.d0)) ref_sched = ref_sched.insert(60, pulse.Delay(10, self.d0)) ref_sched = ref_sched.insert(70, pulse.Delay(20, self.d0)) ref_sched = ref_sched.insert(90, pulse.Delay(10, self.d0)) self.assertScheduleEqual(block, ref_sched)
def test_channels(self): """Test if all channels are returned.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(len(block.channels), 2)
def test_append_an_instruction_to_empty_block(self): """Test append instructions to an empty block.""" block = pulse.ScheduleBlock() block = block.append(pulse.Play(self.test_waveform0, self.d0)) self.assertEqual(block.instructions[0], pulse.Play(self.test_waveform0, self.d0))
def test_append_an_instruction_to_block_inplace(self): """Test append instructions to a non-empty block with inplace.""" block = pulse.ScheduleBlock() block = block.append(pulse.Delay(100, self.d0)) block.append(pulse.Delay(100, self.d0), inplace=True) self.assertEqual(len(block.blocks), 2)
def test_channel_duraction(self): """Test if correct durations is calculated for each channel.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(block.ch_duration(self.d0), 350) self.assertEqual(block.ch_duration(self.d1), 200)
def test_len(self): """Test __len__ method""" block = pulse.ScheduleBlock() self.assertEqual(len(block), 0) for j in range(1, 10): block = block.append(pulse.Delay(10, self.d0)) self.assertEqual(len(block), j)
def test_channel_stop_time(self): """Test if correct stop time is calculated for each channel.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) self.assertEqual(block.ch_stop_time(self.d0), 350) self.assertEqual(block.ch_stop_time(self.d1), 200)
def test_append_an_instruction_to_block(self): """Test append instructions to a non-empty block.""" block = pulse.ScheduleBlock() block = block.append(pulse.Delay(100, self.d0)) block = block.append(pulse.Delay(100, self.d0)) self.assertEqual(len(block.instructions), 2)
def test_equality_of_parametrized_channels(self): """Test check equality of blocks involving parametrized channels.""" par_ch = circuit.Parameter("ch") block1 = pulse.ScheduleBlock(alignment_context=self.left_context) block1 += pulse.Play(self.test_waveform0, pulse.DriveChannel(par_ch)) block1 += pulse.Play(self.test_par_waveform0, self.d0) block2 = pulse.ScheduleBlock(alignment_context=self.left_context) block2 += pulse.Play(self.test_par_waveform0, self.d0) block2 += pulse.Play(self.test_waveform0, pulse.DriveChannel(par_ch)) self.assertEqual(block1, block2) block1_assigned = block1.assign_parameters({par_ch: 1}) block2_assigned = block2.assign_parameters({par_ch: 1}) self.assertEqual(block1_assigned, block2_assigned)
def test_cannot_get_duration_if_not_assigned(self): """Test raise error when duration is not assigned.""" block = pulse.ScheduleBlock() block += pulse.Play(self.test_par_waveform0, self.d0) with self.assertRaises(PulseError): # pylint: disable=pointless-statement block.duration
def test_cannot_shift(self): """Test shift is not supported.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) with self.assertRaises(PulseError): block.shift(10, inplace=True)
def test_nested_parametrized_instructions(self): """Test parameters of nested schedule can be assigned.""" test_waveform = pulse.Constant(100, self.amp0) param_sched = pulse.Schedule(pulse.Play(test_waveform, self.d0)) call_inst = pulse.instructions.Call(param_sched) sub_block = pulse.ScheduleBlock() sub_block += call_inst block = pulse.ScheduleBlock() block += sub_block self.assertTrue(block.is_parameterized()) # assign durations block = block.assign_parameters({self.amp0: 0.1}) self.assertFalse(block.is_parameterized())
def test_get_assigend_duration(self): """Test duration is correctly evaluated.""" block = pulse.ScheduleBlock() block += pulse.Play(self.test_par_waveform0, self.d0) block += pulse.Play(self.test_waveform0, self.d0) block = block.assign_parameters({self.dur0: 300}) self.assertEqual(block.duration, 400)
def test_cannot_append_schedule(self): """Test schedule cannot be appended. Schedule should be input as Call instruction.""" block = pulse.ScheduleBlock() sched = pulse.Schedule() sched += pulse.Delay(10, self.d0) with self.assertRaises(PulseError): block.append(sched)
def test_inherit_from(self): """Test creating schedule with another schedule.""" ref_metadata = {"test": "value"} ref_name = "test" base_sched = pulse.ScheduleBlock(name=ref_name, metadata=ref_metadata) new_sched = pulse.ScheduleBlock.initialize_from(base_sched) self.assertEqual(new_sched.name, ref_name) self.assertDictEqual(new_sched.metadata, ref_metadata)
def test_timeslots(self): """Test if correct timeslot is returned with implicit scheduling.""" block = pulse.ScheduleBlock() for inst in self.test_blocks: block.append(inst) ref_slots = { self.d0: [(0, 100), (100, 150), (150, 350)], self.d1: [(0, 200)] } self.assertDictEqual(block.timeslots, ref_slots)