Skip to main content
IBM Quantum Platform

Commuting2qGateRouter

class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)

GitHub

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
     |
     4

Para 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 SwapStrategy que 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)

GitHub

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

name()

GitHub

Nome do passe.

Tipo de retorno

str

run

run(dag)

GitHub

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

DAGCircuit

swap_decompose

swap_decompose(dag, node, current_layout, swap_strategy)

GitHub

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 Commuting2qBlock que 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

DAGCircuit

update_status

update_status(state, run_state)

GitHub

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

PassManagerState

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.