Qiskit / qiskit-ibm-provider

Qiskit Provider for accessing the IBM Quantum Services: Online Systems and Simulators
https://qiskit.org/ecosystem/ibm-provider/
Apache License 2.0
77 stars 68 forks source link

Adding save_statevector support for ibmq_qasm_simulator and simulator_statevector #225

Closed mx73 closed 1 year ago

mx73 commented 2 years ago

What is the expected enhancement?

Right now, save_statevector only works on local Aer simulator. On IBM's simulators, we must use snapshot_statevector with a decrepation warning, and using save_statevector returns TranspilerError: "Unable to map source basis {('h', 1), ('cx', 2), ('save_statevector', 31), ('t', 1), ('tdg', 1), ('ry', 1)} to target basis {'u', 'mcx', 'mcrz', 'id', 'mcrx', 'mcy', 'p', 'mcry', 'y', 'delay', 'rx', 'ryy', 'kraus', 'mcz', 'mcp', 'mcu1', 'sx', 'cswap', 'mcr', 'snapshot', 'rxx', 'mcsx', 'u3', 'rz', 'cx', 'csx', 'cp', 'u1', 'mcu3', 'measure', 'rzx', 'multiplexer', 'swap', 'z', 's', 'roerror', 'cu2', 'r', 'reset', 'mcswap', 'cu1', 'cu3', 'rzz', 'ry', 'mcu2', 'initialize', 'cz', 'h', 'barrier', 'sdg', 't', 'diagonal', 'x', 'ccx', 'cy', 'tdg', 'u2', 'unitary'} over library <qiskit.circuit.equivalence.EquivalenceLibrary object at 0x000002A1006EFFA0>." I suggest adding save_statevector support for the cloud simulators.

daka1510 commented 2 years ago

Worked on a small code snippet to reproduce the reported issue

from qiskit import IBMQ

from qiskit import QuantumCircuit, transpile
from qiskit.providers.aer import QasmSimulator

# prepare a simple circuit
circuit = QuantumCircuit(2, 2)
circuit.h(0)
circuit.cx(0, 1)
circuit.save_statevector()

# run circuit using qiskit.providers.aer.QasmSimulator (succeeds)
simulator = QasmSimulator()
compiled_circuit = transpile(circuit, simulator)
job = simulator.run(compiled_circuit, shots=1000)
job.result().get_statevector()

# run circuit using ibmq_qasm_simulator simulator backend (fails)
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q')
backend = provider.get_backend('ibmq_qasm_simulator')
compiled_circuit = transpile(circuit, backend)
job = backend.run(compiled_circuit, shots=1000)
job.result().get_statevector()
Expand to see resulting output (screenshot) image

The reported exception is raised in qiskit.transpiler.passes.basis.basis_translator.py and I'm not sure if/what is missing in https://github.com/qiskit/qiskit-ibmq-provider.

@jyu00, @mtreinish - can you help to understand

kt474 commented 1 year ago

stale issue, closing