def test_custom_gate_with_label(self): """Test that custom gate is correctly serialized with a label""" custom_gate = Gate("black_box", 1, []) custom_definition = QuantumCircuit(1) custom_definition.h(0) custom_definition.rz(1.5, 0) custom_definition.sdg(0) custom_gate.definition = custom_definition custom_gate.label = "My special black box with a definition" qc = QuantumCircuit(1) qc.append(custom_gate, [0]) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ) self.assertEqual(qc.decompose(), new_circ.decompose()) self.assertEqual([x[0].label for x in qc.data], [x[0].label for x in new_circ.data])
def test_evolutiongate_param_vec_time(self): """Test loading a an evolution gate that has a param vector element for time.""" synthesis = LieTrotter(reps=2) time = ParameterVector("TimeVec", 1) evo = PauliEvolutionGate((Z ^ I) + (I ^ Z), time=time[0], synthesis=synthesis) qc = QuantumCircuit(2) qc.append(evo, range(2)) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ) self.assertEqual([x.operation.label for x in qc.data], [x.operation.label for x in new_circ.data]) new_evo = new_circ.data[0].operation self.assertIsInstance(new_evo, PauliEvolutionGate)
def test_custom_instruction_with_noop_definition(self): """Test that a custom instruction whose definition contains no elements is serialized with a proper definition. Regression test of gh-7429.""" empty = QuantumCircuit(1, name="empty").to_instruction() opaque = Instruction("opaque", 1, 0, []) qc = QuantumCircuit(2) qc.append(empty, [0], []) qc.append(opaque, [1], []) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ) self.assertEqual(qc.decompose(), new_circ.decompose()) self.assertEqual(len(new_circ), 2) self.assertIsInstance(new_circ.data[0][0].definition, QuantumCircuit) self.assertIs(new_circ.data[1][0].definition, None)
def load_qpy(qpy_files): """Load qpy circuits from files and compare to reference circuits.""" for path, circuits in qpy_files.items(): print(f"Loading qpy file: {path}") with open(path, "rb") as fd: qpy_circuits = load(fd) for i, circuit in enumerate(circuits): bind = None if path == "parameterized.qpy": bind = [1, 2] elif path == "param_phase.qpy": if i == 0: bind = [1, 2] else: bind = [1] elif path == "parameter_vector.qpy": bind = np.linspace(1.0, 2.0, 22) elif path == "parameter_vector_expression.qpy": bind = np.linspace(1.0, 2.0, 15) assert_equal(circuit, qpy_circuits[i], i, bind=bind)
def test_bound_parameter(self): """Test a circuit with a bound parameter is correctly serialized.""" theta = Parameter("theta") qc = QuantumCircuit(5, 1) qc.h(0) for i in range(4): qc.cx(i, i + 1) qc.barrier() qc.rz(theta, range(5)) qc.barrier() for i in reversed(range(4)): qc.cx(i, i + 1) qc.h(0) qc.measure(0, 0) qc.assign_parameters({theta: 3.14}) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ)
def test_parameter_vector_element_in_expression(self): """Test a circuit with a parameter vector used in a parameter expression.""" qc = QuantumCircuit(7) entanglement = [[i, i + 1] for i in range(7 - 1)] input_params = ParameterVector("x_par", 14) user_params = ParameterVector("\u03B8_par", 1) for i in range(qc.num_qubits): qc.ry(user_params[0], qc.qubits[i]) for source, target in entanglement: qc.cz(qc.qubits[source], qc.qubits[target]) for i in range(qc.num_qubits): qc.rz(-2 * input_params[2 * i + 1], qc.qubits[i]) qc.rx(-2 * input_params[2 * i], qc.qubits[i]) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circuit = load(qpy_file)[0] expected_params = [x.name for x in qc.parameters] self.assertEqual([x.name for x in new_circuit.parameters], expected_params)
def test_mixed_registers(self): """Test circuit with mix of standalone and shared registers.""" qubits = [Qubit() for _ in range(5)] clbits = [Clbit() for _ in range(5)] qc = QuantumCircuit() qc.add_bits(qubits) qc.add_bits(clbits) qr = QuantumRegister(bits=qubits) cr = ClassicalRegister(bits=clbits) qc.add_register(qr) qc.add_register(cr) qr_standalone = QuantumRegister(2, "standalone") qc.add_register(qr_standalone) cr_standalone = ClassicalRegister(2, "classical_standalone") qc.add_register(cr_standalone) qc.unitary(random_unitary(32, seed=42), qr) qc.unitary(random_unitary(4, seed=100), qr_standalone) qc.measure(qr, cr) qc.measure(qr_standalone, cr_standalone) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circ = load(qpy_file)[0] self.assertEqual(qc, new_circ)