TranspileLayout
class qiskit.transpiler.TranspileLayout(initial_layout, input_qubit_mapping, final_layout=None, _input_qubit_count=None, _output_qubit_list=None)
Bases: object
Atributos de layout para o circuito de saída do transpilador.
O transpiler é de preservação unitária até as permutações de "layout inicial" e "layout final". A permutação do layout inicial é causada pela definição e aplicação do layout inicial durante o estágio de Layout. A permutação final do layout é causada pela SwapGate inserção durante o estágio de roteamento. Essa classe fornece uma interface para raciocinar sobre essas permutações usando uma variedade de métodos auxiliares.
Durante o estágio de layout, o transpilador pode, potencialmente, remapear a ordem dos qubits no circuito à medida que ajusta o circuito ao backend de destino. Por exemplo, deixe o circuito de entrada ser:
from qiskit.circuit import QuantumCircuit, QuantumRegister
qr = QuantumRegister(3, name="MyReg")
qc = QuantumCircuit(qr)
qc.h(0)
qc.cx(0, 1)
qc.cx(0, 2)
qc.draw("mpl")
Suponha que, durante o estágio de layout, o transpilador reordene os qubits para que sejam:
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(2)
qc.cx(2, 1)
qc.cx(2, 0)
qc.draw("mpl")
Então, a saída do método initial_virtual_layout() é equivalente a:
Layout({
qr[0]: 2,
qr[1]: 1,
qr[2]: 0,
})(também é esse atributo no QuantumCircuit.draw() e circuit_drawer() que é usado para exibir o mapeamento de qubits para posições em visualizações de circuito após a transpilação).
Com base no exemplo acima, suponha que, durante o estágio de roteamento, o transpilador precise inserir portas de troca, e o circuito de saída se torne:
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(2)
qc.cx(2, 1)
qc.swap(0, 1)
qc.cx(2, 1)
qc.draw("mpl")
Então, o resultado do método routing_permutation() é:
[1, 0, 2]que mapeia as posições dos qubits antes do roteamento para suas posições finais após o roteamento.
Há três atributos públicos associados à classe, mas eles são fornecidos principalmente para compatibilidade com versões anteriores e representam o estado interno do transpilador. Eles são definidos como:
initial_layout- Este atributo é utilizado para modelar a permutação causada pela etapa de Layout. É umLayoutobjeto que mapeia os objetosQubitda lista deQuantumCircuitentrada para a posição na lista deQuantumCircuit.qubitssaída.input_qubit_mapping- Esse atributo é usado para manter a ordem de entrada do objetoQuantumCircuitoriginal. Ele mapeia o objeto virtualQubitdo circuito original (einitial_layout) para sua posição correspondente emQuantumCircuit.qubitsno circuito original. Isso é necessário ao calcular a permutação doOperatordo circuito (e usado porOperator.from_circuit()).final_layout- Este atributo é utilizado para modelar a permutação causada pela etapa de roteamento. É umLayoutobjeto que mapeia os qubits do circuito de saída deQuantumCircuit.qubitsno circuito de saída para suas posições finais após o roteamento. É importante ressaltar que isso representa apenas a permutação causada pela inserçãoSwapGatede s noQuantumCircuitdurante a etapa de roteamento. Não se trata de uma correspondência entre a posição do circuito de entrada original e a posição final no circuito transpilado. Se precisar disso, você pode usar ofinal_index_layout()para gerar isso. Sefinal_layoutestiver definido comoNone, isso indica que o roteamento não foi executado e pode ser considerado equivalente a um layout trivial com os qubits da listaqubitsdo circuito de saída.
Atributos
Parâmetros
- initial_layout (Layout)
- input_qubit_mapping (dict[Qubit, int])
- final_layout (Layout | None)
- _input_qubit_count (int | None)
- _output_qubit_list (list[Qubit] | None)
final_layout
Tipo: Layout | None
Valor Padrão: None
initial_layout
Tipo: Layout
input_qubit_mapping
Tipo: dict[Qubit, int]
Métodos
final_index_layout
final_index_layout(filter_ancillas=True)
Gera o layout final como uma matriz de números inteiros.
Esse método gerará uma matriz de posições finais para cada qubit no circuito de entrada. Por exemplo, se você tivesse um circuito de entrada como:
qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.cx(0, 2)e a saída do transpilador foi:
tqc = QuantumCircuit(3)
tqc.h(2)
tqc.cx(2, 1)
tqc.swap(0, 1)
tqc.cx(2, 1)então o método final_index_layout() método retorna:
[2, 0, 1]Isso pode ser visto da seguinte forma. O Qubit 0 no circuito original é mapeado para o qubit 2 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 2 durante o estágio de roteamento. O Qubit 1 no circuito original é mapeado para o qubit 1 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 0 durante o estágio de roteamento. O Qubit 2 no circuito original é mapeado para o qubit 0 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 1 durante o estágio de roteamento. O comprimento da lista de saída será tão grande quanto o número de qubits do circuito de entrada, pois a lista de saída desse método serve para rastrear a permutação de qubits no circuito original causada pelo transpilador.
Parâmetros
filter_ancillas (bool) – Se definido como False , todos os ancillas alocados no circuito de saída serão incluídos no layout.
Retorna
Uma lista de posições finais para cada qubit do circuito de entrada.
Tipo de retorno
final_virtual_layout
final_virtual_layout(filter_ancillas=True)
Gera o layout final como um objeto Layout objeto.
Esse método gerará uma matriz de posições finais para cada qubit no circuito de entrada. Por exemplo, se você tivesse um circuito de entrada como:
qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.cx(0, 2)e a saída do transpilador foi:
tqc = QuantumCircuit(3)
tqc.h(2)
tqc.cx(2, 1)
tqc.swap(0, 1)
tqc.cx(2, 1)então o retorno dessa função seria um objeto de layout:
Layout({
qc.qubits[0]: 2,
qc.qubits[1]: 0,
qc.qubits[2]: 1,
})Isso pode ser visto da seguinte forma. O Qubit 0 no circuito original é mapeado para o qubit 2 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 2 durante o estágio de roteamento. O Qubit 1 no circuito original é mapeado para o qubit 1 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 0 durante o estágio de roteamento. O Qubit 2 no circuito original é mapeado para o qubit 0 no circuito de saída durante o estágio de layout, que é mapeado para o qubit 1 durante o estágio de roteamento. O comprimento da lista de saída será tão grande quanto o número de qubits do circuito de entrada, pois a lista de saída desse método serve para rastrear a permutação de qubits no circuito original causada pelo transpilador.
Parâmetros
filter_ancillas (bool) – Se definido como False , todos os ancillas alocados no circuito de saída serão incluídos no layout.
Retorna
Um objeto de layout que mapeia as posições finais de cada qubit.
Tipo de retorno
from_property_set
classmethod from_property_set(dag, property_set)
Construa o TranspileLayout lendo os campos da tabela PropertySet. Retorna None se não houver chaves de configuração de layout presentes.
Isso inclui a combinação das diferentes chaves do conjunto de propriedades no conjunto completo de layouts iniciais e finais, incluindo permutações virtuais.
Isso não invalida nem altera de forma alguma o conjunto de propriedades fornecido. Para "canonizar" o conjunto de propriedades posteriormente, chame write_into_property_set().
Isso lê as seguintes chaves de conjunto de propriedades:
layout
Obrigatório. O objeto Layout objeto que mapeia qubits virtuais (potencialmente expandidos com ancillas) para índices de qubits físicos. Isso corresponde diretamente a initial_layout.
Em todos os usos padrão, esse é um campo obrigatório. No entanto, se virtual_permutation_layout estiver definido, um layout "trivial" será inferido, mesmo que o circuito não esteja de fato disposto no hardware. Essa é uma limitação infeliz do modelo de dados dessa classe, em que não é possível especificar uma permutação final sem ter também um layout inicial. Essa deficiência será corrigida no Qiskit 3.0.
original_qubit_indices
Obrigatório (mas definido automaticamente pelo PassManager). O mapeamento {virtual: index} que indica o índice relativo de cada qubit virtual de entrada, no circuito de entrada. Isso também pode ser expandido com ancillas (nesse caso, os índices de ancilla não significam muito, pois não estavam no circuito de entrada).
num_input_qubits
Obrigatório (mas definido automaticamente pelo PassManager). O número de qubits virtuais explícitos no circuito de entrada (ou seja, sem incluir os ancillas implícitos).
final_layout
Opcional. A permutação final efetiva, em termos dos qubits atuais do DAGCircuit. Isso corresponde diretamente a final_layout.
virtual_permutation_layout
Opcional. Isso é definido por determinadas passagens de otimização que são executadas antes da seleção do layout, como ElidePermutations. Seu espírito é semelhante ao de final_layout, mas normalmente se aplica apenas aos qubits virtuais de entrada.
Esse objeto usa a convenção de permutação oposta a final_layout devido a um descuido no Qiskit durante sua introdução. Em outras palavras, virtual_permutation_layout mapeia uma instância Qubit no final do circuito para seu índice inteiro no início do circuito.
Parâmetros
- dag (DAGCircuit) – o estado atual do
DAGCircuit. - property_set (PropertySet) – o conjunto de propriedades do transpilador atual. Isso deve ter pelo menos a chave
layoutdefinida.
Tipo de retorno
TranspileLayout | Nenhum
initial_index_layout
initial_index_layout(filter_ancillas=False)
Gera um layout inicial como uma matriz de números inteiros.
Parâmetros
filter_ancillas (bool) – Se definido como True , qualquer qubits ancilla adicionado ao transpilador não será incluído na saída.
Retorna
Uma matriz de layout que mapeia uma posição na matriz para sua nova posição no circuito de saída.
Tipo de retorno
initial_virtual_layout
initial_virtual_layout(filter_ancillas=False)
Retorna um objeto Layout para o layout inicial.
Isso retorna um mapeamento de objetos virtuais Qubit no circuito de entrada para as posições dos qubits físicos selecionados durante o layout. Isso é análogo ao atributo initial_layout atributo.
Parâmetros
filter_ancillas (bool) – Se definido como True , somente os qubits no circuito de entrada estarão no layout retornado. Qualquer qubits ancilla adicionado ao circuito de saída será filtrado do objeto retornado.
Retorna
Um objeto de layout que mapeia os objetos do circuito de entrada Qubit do circuito de entrada para as posições dos qubits físicos selecionados.
Tipo de retorno
routing_permutation
routing_permutation()
Gera um layout final como uma matriz de números inteiros.
Se não houver nenhum atributo final_layout presente, isso indica que não houve permutação de saída causada por roteamento ou outras transformações do transpilador. Nesse caso, a função retornará uma lista de [0, 1, 2, .., n].
Retorna
Uma matriz de layout que mapeia uma posição na matriz para sua nova posição no circuito de saída.
Tipo de retorno
write_into_property_set
write_into_property_set(property_set)
"Descompacte" esse layout na forma de restrições soltas do site property_set.
Esse é o método inverso de from_property_set().
Isso sempre grava as seguintes chaves de definição de propriedade, substituindo-as se já estiverem definidas:
layout
Corresponde diretamente a initial_layout.
original_qubit_indices
Corresponde diretamente a input_qubit_mapping.
final_layout
Corresponde diretamente a final_layout. Observe que isso pode não ser idêntico ao final_layout de antes de uma chamada para from_property_set()porque os efeitos de virtual_permutation_layout terão sido combinados nele.
virtual_permutation_layout
Excluído do conjunto de propriedades; TranspileLayout "finaliza" as várias permutações separadas em uma única permutação, para manter a forma canônica.
Além disso, as seguintes chaves são atualizadas, se este TranspileLayout tiver um valor conhecido para elas. Eles são deixados como estão, caso contrário, para lidar com casos em que essa classe foi construída manualmente sem definir determinados campos opcionais.
num_input_qubits
O número de qubits virtuais não-ancilla no circuito de entrada.
Parâmetros
property_set (dict[str, object]) – o PropertySet (ou geral dict) no qual a saída deve ser gravada. Isso altera a entrada no local.