def test_hadamard_expectation(self, backend_specs, monkeypatch): """Test that the expectation value of the Hadamard is computed correctly.""" n_wires = 2 theta = 0.432 phi = 0.123 dev = qml.device("orquestra.qulacs", wires=2) def circuit(): qml.RY(theta, wires=[0]) qml.RY(phi, wires=[1]) qml.CNOT(wires=[0, 1]) return qml.expval(qml.Hadamard(wires=0)), qml.expval( qml.Hadamard(wires=1)) qnode = qml.QNode(circuit, dev) qnode._construct([], {}) qasm_circuit = dev.serialize_circuit(qnode.circuit) ops, _ = dev.process_observables(qnode.circuit.observables) ops = json.dumps(ops) lst = [] monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(dev.backend_specs, qasm_circuit, ops) expected = np.array([ np.sin(theta) * np.sin(phi) + np.cos(theta), np.cos(theta) * np.cos(phi) + np.sin(phi) ]) / np.sqrt(2) assert np.allclose(lst[0], expected, atol=analytic_tol)
def test_run_circuit_and_get_expval_rot_cnot(self, backend_specs, monkeypatch): """Tests that the correct result in obtained for a circuit that contains rotations and a CNOT.""" lst = [] theta = 0.432 phi = 0.123 circ_qasm = f'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\ncreg c[2];\nrx({theta}) q[0];\nrx({phi}) q[1];\ncx q[0],q[1];' op = '["[Z0]", "[Z1]"]' # Instead of creating a json at the end of the step, just append it to # a local list monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(backend_specs, circ_qasm, op) res = np.array(lst[0]) assert np.allclose(res, np.array( [np.cos(theta), np.cos(theta) * np.cos(phi)]), atol=analytic_tol)
def test_only_measure_circuit(self, backend_specs, op, monkeypatch): """Tests that the correct result in obtained for a circuit that only contains measurements.""" lst = [] simple_qasm = 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[3];\ncreg c[3];\n' monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val[0])) expval.run_circuit_and_get_expval(backend_specs, simple_qasm, op) assert lst[0] == 1.0
def test_only_measure_circuit(self, op, backend_specs, monkeypatch): """Tests that the correct result in obtained for a circuit that only contains measurements.""" lst = [] only_measure_qasm = 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[3];\ncreg c[3];\n' # Instead of creating a json at the end of the step, just append it to # a local list monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(backend_specs, only_measure_qasm, op) assert lst[0][0] == 1
def test_run_circuit_and_get_expval_hadamard(self, backend_specs, monkeypatch): """Tests that the correct result in obtained for a circuit that contains a Hadamard gate.""" lst = [] hadamard_qasm = 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[2];\ncreg c[2];\nh q[0];\n' op = '["[Z0]"]' monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(backend_specs, hadamard_qasm, op) assert math.isclose(lst[0][0], 0.0, abs_tol=tol)
def test_run_circuit_and_get_expval_simple_ibmq(self, token, op, monkeypatch): """Test running an empty circuit.""" lst = [] IBMQ.enable_account(token) backend_specs = '{"module_name": "qeqiskit.backend", "function_name": "QiskitBackend", "device_name": "ibmq_qasm_simulator", "n_samples": 8192}' simple_qasm = 'OPENQASM 2.0;\ninclude "qelib1.inc";\nqreg q[3];\ncreg c[3];\n' monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(backend_specs, simple_qasm, op) assert math.isclose(lst[0][0], 1.0, abs_tol=tol)
def test_hadamard_expectation_plugin_integration(self, backend_specs, monkeypatch): """Test that the expectation value of the Hadamard is computed correctly when integrating the step function with the plugin.""" n_wires = 2 theta = 0.432 phi = 0.123 dev = qml.device("orquestra.qulacs", wires=2) def circuit(): qml.RY(theta, wires=[0]) qml.RY(phi, wires=[1]) qml.CNOT(wires=[0, 1]) return qml.expval(qml.Hadamard(wires=0)), qml.expval( qml.Hadamard(wires=1)) with monkeypatch.context() as m: m.setattr(dev, "execute", lambda *args, **kwargs: np.array([None])) qnode = qml.QNode(circuit, dev) qnode() circuit = qnode.qtape qasm_circuit = dev.serialize_circuit(circuit) ops, _ = dev.process_observables(circuit.observables) ops = json.dumps(ops) lst = [] # Instead of creating a json at the end of the step, just append it to # a local list monkeypatch.setattr(expval, "save_list", lambda val, name: lst.append(val)) expval.run_circuit_and_get_expval(dev.backend_specs, qasm_circuit, ops) expected = np.array([ np.sin(theta) * np.sin(phi) + np.cos(theta), np.cos(theta) * np.cos(phi) + np.sin(phi) ]) / np.sqrt(2) assert np.allclose(lst[0], expected, atol=analytic_tol)