def test_three_qbit_clean(): c = circuit.Circuit() qubit_names = ["D1", "A1", "D2", "A2", "D3"] # clean ancillas have infinite life-time for qb in qubit_names: # set lifetime to only almost inf so that waiting gates are added but # ineffective c.add_qubit(qb, np.inf, 1e10) c.add_hadamard("A1", time=0) c.add_hadamard("A2", time=0) c.add_cphase("A1", "D1", time=200) c.add_cphase("A2", "D2", time=200) c.add_cphase("A1", "D2", time=100) c.add_cphase("A2", "D3", time=100) c.add_hadamard("A1", time=300) c.add_hadamard("A2", time=300) with pytest.warns(UserWarning): m1 = circuit.Measurement("A1", time=350, sampler=None) c.add_gate(m1) with pytest.warns(UserWarning): m2 = circuit.Measurement("A2", time=350, sampler=None) c.add_gate(m2) c.add_waiting_gates(tmin=0, tmax=1500) c.order() assert len(c.gates) == 27 sdm = sparsedm.SparseDM(qubit_names) for bit in sdm.classical: sdm.classical[bit] = 1 sdm.classical["D3"] = 0 assert sdm.classical == {'A1': 1, 'A2': 1, 'D3': 0, 'D1': 1, 'D2': 1} for i in range(100): c.apply_to(sdm) assert len(m1.measurements) == 100 assert len(m2.measurements) == 100 assert sdm.classical == {} # in a clean run, we expect just one possible path assert np.allclose(sdm.trace(), 1) assert m1.measurements == [1] * 100 assert m2.measurements == [0, 1] * 50
def test_three_qbit_clean_qasm(): config_qasm = os.path.join(os.path.dirname(__file__), 'config_qasm_5q.json') config_sim = os.path.join(os.path.dirname(__file__), 'config_simulator.json') parser = qasm.ConfigurableParser(config_qasm, config_sim) with pytest.warns(UserWarning): circuits = parser.parse(threequbit_qasm.split('\n')) assert len(circuits) == 1 c = circuits[0] qubit_names = ["q0", "q1", "q2", "q3", "q4"] with pytest.warns(UserWarning): m1 = circuit.Measurement("q1", time=400, sampler=None) c.add_gate(m1) with pytest.warns(UserWarning): m2 = circuit.Measurement("q3", time=400, sampler=None) c.add_gate(m2) c.add_waiting_gates(tmin=0, tmax=1500) c.order() assert len(c.gates) == 29 sdm = sparsedm.SparseDM(qubit_names) for bit in sdm.classical: sdm.classical[bit] = 1 sdm.classical["q4"] = 0 assert sdm.classical == {'q1': 1, 'q3': 1, 'q4': 0, 'q0': 1, 'q2': 1} for i in range(100): c.apply_to(sdm) assert len(m1.measurements) == 100 assert len(m2.measurements) == 100 assert sdm.classical == {} # in a clean run, we expect just one possible path assert np.allclose(sdm.trace(), 1) assert m1.measurements == [1] * 100 assert m2.measurements == [0, 1] * 50
def test_output_bit(self): with pytest.warns(UserWarning): m = circuit.Measurement("A", 0, sampler=None, output_bit="O") sdm = MagicMock() sdm.peak_measurement = MagicMock(return_value=(0, 1)) sdm.project_measurement = MagicMock() sdm.set_bit = MagicMock() m.apply_to(sdm) assert m.measurements == [1] sdm.peak_measurement.assert_called_once_with("A") sdm.project_measurement.assert_called_once_with("A", 1) sdm.set_bit.assert_called_once_with("O", 1) sdm.peak_measurement = MagicMock(return_value=(1, 0)) sdm.project_measurement = MagicMock() sdm.set_bit = MagicMock() m.apply_to(sdm) assert m.measurements == [1, 0] sdm.peak_measurement.assert_called_once_with("A") sdm.project_measurement.assert_called_once_with("A", 0) sdm.set_bit.assert_called_once_with("O", 0)
def test_apply_random(self): sampler = circuit.uniform_sampler(42) m = circuit.Measurement("A", 0, sampler=sampler) with patch('numpy.random.RandomState') as rsclass: rs = MagicMock() rsclass.return_value = rs rs.random_sample = MagicMock() p = rs.random_sample p.return_value = 0.3 sdm = MagicMock() sdm.peak_measurement = MagicMock(return_value=(0.06, 0.04)) sdm.project_measurement = MagicMock() m.apply_to(sdm) sdm.project_measurement.assert_called_once_with("A", 0) sdm.peak_measurement = MagicMock(return_value=(0.06, 0.04)) sdm.project_measurement = MagicMock() p.return_value = 0.7 m.apply_to(sdm) sdm.project_measurement.assert_called_once_with("A", 1)
def test_order_regression_classical(self): c = circuit.Circuit("test") c.add_qubit("D", 1000, 1000) c.add_qubit("A", 1000, 1000) c.add_qubit("MA") c.add_qubit("SA") c.add_gate(circuit.RotateY("A", time=0, angle=np.pi / 2)) c.add_gate(circuit.CPhase("A", "D", time=10)) rotate_normal = circuit.RotateY("A", time=20, angle=-np.pi / 2) rotate_backwards = circuit.RotateY("A", time=20, angle=np.pi / 2) conditional_rotate1 = circuit.ConditionalGate( control_bit="SA", time=20, zero_gates=[rotate_normal], one_gates=[]) c.add_gate(conditional_rotate1) conditional_rotate2 = circuit.ConditionalGate( control_bit="SA", time=30, zero_gates=[], one_gates=[rotate_backwards]) c.add_gate(conditional_rotate2) sampler = circuit.BiasedSampler(readout_error=0.0015, alpha=1, seed=43) measurement = circuit.Measurement( "A", time=40, sampler=sampler, output_bit="MA") c.add_gate(measurement) c.add_gate(circuit.ClassicalCNOT("MA", "SA", time=35)) assert len(c.gates) == 6 c.order() assert len(c.gates) == 6
def test_apply_to(self): sdm = MagicMock() sdm.hadamard = MagicMock() sdm.amp_ph_damping = MagicMock() sdm.apply_ptm = MagicMock() sdm.peak_measurement = MagicMock(return_value=(1, 0)) sdm.project_measurement = MagicMock() c = circuit.Circuit() c.add_qubit(circuit.Qubit("A", 10, 20)) c.add_gate(circuit.Hadamard("A", 0)) c.add_gate(circuit.Hadamard("A", 10)) with pytest.warns(UserWarning): c.add_gate(circuit.Measurement("A", 20, sampler=None)) c.add_waiting_gates() c.order() c.apply_to(sdm) sdm.assert_has_calls([call.apply_ptm("A", ptm=ANY), call.apply_ptm("A", ptm=ANY), call.apply_ptm("A", ptm=ANY), call.apply_ptm("A", ptm=ANY), call.peak_measurement("A"), call.project_measurement("A", 0)])
def test_one_sampler_two_measurements(self): # Biased sampler s = circuit.BiasedSampler(alpha=1, readout_error=0.7) m1 = circuit.Measurement("A", 0, sampler=s, output_bit="O") m2 = circuit.Measurement("A", 0, sampler=s, output_bit="O") # uniform sampler s = circuit.uniform_sampler(seed=42) m1 = circuit.Measurement("A", 0, sampler=s, output_bit="O") m2 = circuit.Measurement("A", 0, sampler=s, output_bit="O") # selection sampler s = circuit.selection_sampler(result=1) m1 = circuit.Measurement("A", 0, sampler=s, output_bit="O") m2 = circuit.Measurement("A", 0, sampler=s, output_bit="O") m1, m2
def test_apply_with_selection_sampler(self): m = circuit.Measurement("A", 0, sampler=circuit.selection_sampler(1)) sdm = MagicMock() sdm.peak_measurement = MagicMock(return_value=(0, 1)) sdm.project_measurement = MagicMock() m.apply_to(sdm) assert m.measurements == [1] sdm.peak_measurement.assert_called_once_with("A") sdm.project_measurement.assert_called_once_with("A", 1) sdm.peak_measurement = MagicMock(return_value=(1, 0)) sdm.project_measurement = MagicMock() m.apply_to(sdm) assert m.measurements == [1, 1] sdm.peak_measurement.assert_called_once_with("A") sdm.project_measurement.assert_called_once_with("A", 1)
def test_init(self): with pytest.warns(UserWarning): m = circuit.Measurement("A", 0, sampler=None) assert m.is_measurement assert m.involves_qubit("A") assert m.time == 0
def test_init(self): m = circuit.Measurement("A", 0, sampler=None) assert m.is_measurement assert m.involves_qubit("A") assert m.time == 0