Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
Bases: TransformationPass
Uma classe para trocar a rota de um ou mais portões de deslocamento para o mapa de acoplamento.
Essa passagem encaminha blocos de portas de dois qubits comutáveis encapsuladas como instruções Commuting2qBlock . Esse passe não se aplica a outras instruções. O mapeamento para o mapa de acoplamento é feito usando estratégias de troca, consulte SwapStrategy. A estratégia de troca deve se adequar ao problema e ao mapa de acoplamento. O ideal é que essa passagem do transpilador seja executada antes que o circuito quântico seja ampliado com qualquer qubits ancilla ociosos. Caso contrário, podemos trocar os qubits fora da parte do chip que queremos usar. Portanto, a estratégia de troca e seu mapa de acoplamento associado não representam qubits físicos. Em vez disso, eles representam um mapeamento intermediário que corresponde aos qubits físicos depois que o layout inicial é aplicado. O exemplo abaixo mostra como mapear um qubit de quatro PauliEvolutionGate para os qubits 0, 1, 3 e 4 do dispositivo de cinco qubits com o mapa de acoplamento
0 -- 1 -- 2
|
3
|
4Para isso, utilizamos uma estratégia de troca de linhas para os qubits 0, 1, 3 e 4, definida em termos dos qubits virtuais 0, 1, 2 e 3.
from qiskit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import Layout, CouplingMap, PassManager
from qiskit.transpiler.passes import FullAncillaAllocation
from qiskit.transpiler.passes import EnlargeWithAncilla
from qiskit.transpiler.passes import ApplyLayout
from qiskit.transpiler.passes import SetLayout
from qiskit.transpiler.passes.routing.commuting_2q_gate_routing import (
SwapStrategy,
FindCommutingPauliEvolutions,
Commuting2qGateRouter,
)
# Define the circuit on virtual qubits
op = SparsePauliOp.from_list([("IZZI", 1), ("ZIIZ", 2), ("ZIZI", 3)])
circ = QuantumCircuit(4)
circ.append(PauliEvolutionGate(op, 1), range(4))
# Define the swap strategy on qubits before the initial_layout is applied.
swap_strat = SwapStrategy.from_line([0, 1, 2, 3])
# Choose qubits 0, 1, 3, and 4 from the backend coupling map shown above.
backend_cmap = CouplingMap(couplinglist=[(0, 1), (1, 2), (1, 3), (3, 4)])
initial_layout = Layout.from_intlist([0, 1, 3, 4], *circ.qregs)
pm_pre = PassManager(
[
FindCommutingPauliEvolutions(),
Commuting2qGateRouter(swap_strat),
SetLayout(initial_layout),
FullAncillaAllocation(backend_cmap),
EnlargeWithAncilla(),
ApplyLayout(),
]
)
# Insert swap gates, map to initial_layout and finally enlarge with ancilla.
pm_pre.run(circ).draw("mpl")Esse gerenciador de passagem depende do site current_layout , que corresponde ao layout do qubit à medida que as portas de troca são aplicadas. A passagem percorrerá todos os nós no dag. Se um nó precisar ser roteado usando uma estratégia de troca, ele será decomposto em subinstruções com camadas de troca entre elas e o site current_layout será modificado. Os nós que não devem ser roteados usando estratégias de troca serão adicionados novamente ao dag levando em conta o current_layout .
Parâmetros
- swap_strategy - Uma instância de um
SwapStrategyque contém as camadas de troca que são usadas e a ordem em que devem ser aplicadas para mapear a instrução para o hardware. Se esse campo não for fornecido, ele deverá estar contido no conjunto de propriedades do passe. Isso permite que outras passagens determinem a estratégia de troca mais adequada em tempo de execução. - edge_coloring - Uma coloração de borda opcional do mapa de acoplamento ( I.e. duas bordas que compartilham um nó não têm a mesma cor). Se a coloração da borda for fornecida, as portas de comutação que podem ser aplicadas simultaneamente, dada a permutação atual do qubit, serão agrupadas de acordo com a coloração da borda e aplicadas de acordo com essa coloração. Aqui, uma cor é um int que é usado como índice para definir e acessar os grupos de portas de comutação que podem ser aplicadas simultaneamente. Se a coloração da borda não for fornecida, os conjuntos serão construídos usando um algoritmo guloso. A coloração da borda é útil para posicionar portas como
RZZGates ao lado de portas de troca para explorar os cancelamentos de CX.
Atributos
is_analysis_pass
Verificar se o passe é um passe de análise.
Se a passagem for um AnalysisPass,, isso significa que a passagem pode analisar o DAG e escrever os resultados dessa análise no conjunto de propriedades. As modificações no DAG não são permitidas por esse tipo de passe.
is_transformation_pass
Verificar se o passe é um passe de transformação.
Se a passagem for um TransformationPass,, isso significa que a passagem pode manipular o DAG, mas não pode modificar o conjunto de propriedades (mas pode ser lido).
Métodos
execute
execute(passmanager_ir, state, callback=None)
Executar a tarefa de otimização para a entrada Qiskit IR.
Parâmetros
- passmanager_ir (Any) – Qiskit IR para otimizar.
- state (PassManagerState) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passes.
- callback (Callable | None) – Uma função de retorno de chamada que é chamada a cada execução da tarefa de otimização.
Retorna
Qiskit IR otimizado e estado do fluxo de trabalho.
Tipo de retorno
tupla [ Any, PassManagerState ]
name
run
run(dag)
Execute a passagem decompondo os nós aos quais ela se aplica.
Parâmetros
dag (DAGCircuit) – O dag ao qual adicionaremos swaps.
Retorna
Um dag em que foram adicionadas trocas para o tipo de portão pretendido.
Aumentos
- TranspilerError - Se a estratégia de troca não tiver sido fornecida no momento da inicialização e não houver nenhuma estratégia de troca no conjunto de propriedades.
- TranspilerError - Se o circuito quântico contiver mais de um registro de qubit.
- TranspilerError - Se houver qubits que não estejam contidos no registro quântico.
Tipo de retorno
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
Pegue uma instância de Commuting2qBlock e mapeie-a para o mapa de acoplamento.
O mapeamento é feito com a estratégia de troca.
Parâmetros
- dag (DAGCircuit) – O dag que contém o
Commuting2qBlockque roteamos. - node (DAGOpNode) – Um nó cuja operação é um
Commuting2qBlock. - current_layout (Layout) – O layout antes de as trocas serem aplicadas. Essa função modificará o layout para que os portões subsequentes possam ser compostos adequadamente no dag.
- swap_strategy (SwapStrategy) – A estratégia de troca usada para decompor o nó.
Retorna
Um dag compatível com o mapa de acoplamento em que portas de troca foram adicionadas para mapear as portas no site Commuting2qBlock para o hardware.
Tipo de retorno
update_status
update_status(state, run_state)
Atualizar o status do fluxo de trabalho.
Parâmetros
- state (PassManagerState) – Passar o estado do gerenciador para atualizar.
- run_state (RunState) – Status de conclusão da tarefa atual.
Retorna
Estado do gerenciador de passes atualizado.
Tipo de retorno