Transpile Qiskit con diversi set di porte di base
Voglio usare la funzione transpile di Qiskit per scomporre una matrice unitaria arbitraria / circuito quantistico in un tipo speciale di porte di base. ( from qiskit.compiler import transpile)
Ma per me sembra che le uniche porte di base accettate siano "u1", "u2", "u3" e "cx". Esiste un modo per utilizzare, ad esempio, "rx", "ry" e "cx" come porte di base invece di "u1", "u2", "u3" e "cx"?
Il seguente errore
Si è verificata un'eccezione: QiskitError "Impossibile srotolare il circuito sulla base data, ['id', 'ry', 'rx', 'cx']. Nessuna regola per espandere l'istruzione h."
ad esempio si ricava dal codice:
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile
import matplotlib.pyplot as plt
from qiskit.compiler.transpile import CouplingMap
coupling_string = [[0, 1], [0,2], [1,2]]
CM = CouplingMap(coupling_string)
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.h(2)
result = transpile(qc, coupling_map=CM, basis_gates=['id', 'ry', 'rx', 'cx'], optimization_level=1, seed_transpiler=1)
result.draw(output='mpl')
plt.show()
Risposte
Quale versione di Qiskit stai utilizzando? Il supporto per la traduzione di base arbitraria è stato aggiunto di recente in Qiskit 0.20.0 / Qiskit-Terra 0.15.0. 1 Se stai eseguendo una versione precedente di Qiskit, il transpiler fallirà in questo modo perché lo unroller non sapeva come usare quel set di base. Tuttavia, quando si utilizza l'ultima versione di Qiskit, verrà visualizzata un'immagine del circuito come:
Vale la pena notare che il transpilation non è eccezionale perché il passaggio di ottimizzazione a 1 qubit non comprende ancora insiemi di base arbitrari e funziona ancora solo per u1, u2, u3, motivo per cui l'output è così grande. C'è del lavoro in sospeso per risolvere questo problemahttps://github.com/Qiskit/qiskit-terra/pull/3658
1 https://qiskit.org/documentation/release_notes.html#qiskit-0-20-0