Qiskit transpile com diferentes conjuntos de portas de base
Eu quero usar a função transpilar Qiskit para decompor uma matriz unitária / circuito quântico arbitrário em um tipo especial de portas básicas. ( from qiskit.compiler import transpile)
Mas, para mim, parece que as únicas portas de base aceitas são 'u1', 'u2', 'u3' e 'cx'. Existe uma maneira de usar, por exemplo, 'rx', 'ry' e 'cx' como portas de base em vez de 'u1', 'u2', 'u3' e 'cx'?
O seguinte erro
Ocorreu uma exceção: QiskitError "Não é possível desenrolar o circuito para a base fornecida, ['id', 'ry', 'rx', 'cx']. Nenhuma regra para expandir a instrução h."
por exemplo, é obtido a partir do código:
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()
Respostas
Qual versão do Qiskit você está executando? Suporte para tradução de base arbitrária foi adicionado recentemente no Qiskit 0.20.0 / Qiskit-Terra 0.15.0. 1 Se você estiver executando uma versão mais antiga do Qiskit, o transpiler irá falhar assim porque o desenrolador não sabia como usar aquele conjunto básico. No entanto, ao usar a versão mais recente do Qiskit, ele exibirá uma imagem de circuito como:
É importante notar que a transpilação não é boa porque o passo de otimização de 1 qubit ainda não entende conjuntos de base arbitrários e ainda funciona apenas para u1, u2, u3, que é o motivo pelo qual a saída é tão grande. Há trabalho pendente para consertar issohttps://github.com/Qiskit/qiskit-terra/pull/3658
1 https://qiskit.org/documentation/release_notes.html#qiskit-0-20-0