Skip to main content
IBM Quantum Platform

TwoQubitPeepholeOptimization

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

GitHub

Bases: TransformationPass

Otimização unificada do “peephole” unitário de dois qubits

Esta etapa do transpiler foi projetada para realizar a otimização unitária do “peephole” de dois qubits. Essa etapa identifica todos os blocos de 2 qubits no circuito, calcula a operação unitária desse bloco e, em seguida, sintetiza essa operação unitária. Se a operação unitária sintetizada de dois qubits for “melhor” do que o subcircuito original, esse subcircuito é usado para substituir o original. A heurística utilizada para determinar qual é a melhor opção analisa, em primeiro lugar, o número de portas de dois qubits no circuito e dá preferência à síntese com menos portas de dois qubits; se o número de portas de dois qubits for o mesmo, ela analisa a fidelidade estimada do circuito e escolhe o subcircuito com maior fidelidade estimada; e, por fim, se necessário, escolhe o subcircuito com o menor número total de portas.

Caso o alvo seja supercompleto, a passagem tentará todos os decompositores suportados para todas as portas suportadas em um determinado qubit. A decomposição que apresentar o melhor desempenho esperado com base na heurística acima será selecionada e utilizada para substituir o bloco.

Este passo foi projetado para ser executado em um circuito físico, e presume-se que os detalhes das operações em um determinado qubit correspondam ao qubit de hardware do alvo. No entanto, o resultado da passagem pode não utilizar operações de hardware; mais especificamente, portas de um único qubit podem ser geradas fora das operações suportadas pelo alvo, normalmente apenas se uma porta parametrizada suportada pelo alvo TwoQubitControlledUDecomposer for utilizada para a síntese. Assim, se essa etapa for executada em uma fase de otimização física (como a fase de Otimização), ela deve ser combinada com etapas como BasisTranslator e/ou Optimize1qGatesDecomposition para garantir que essas portas de qubit único incorretas sejam substituídas por operações suportadas pelo hardware antes de sair da fase.

Essa etapa é multithread e realizará a análise em paralelo, utilizando todos os núcleos disponíveis no seu sistema local. Você pode consultar o guia de configuração para obter detalhes sobre como controlar o comportamento de multithreading do Qiskit de maneira mais ampla, o que também controlará esta etapa

Essa passagem tem funcionalidade semelhante à execução ConsolidateBlocks sequencial de e UnitarySynthesis no seu gerenciador de passagens. No entanto, essa etapa oferece melhor desempenho em tempo de execução, pois realiza a síntese em paralelo. Além disso, possui heurísticas aprimoradas, possibilitadas pela realização da otimização em uma única etapa, o que pode resultar em resultados de melhor qualidade, especialmente em casos de alvos supercompletos e/ou heterogêneos. No entanto, essas heurísticas e essa etapa como um todo são válidas apenas para circuitos físicos. Além disso, ao contrário UnitarySynthesis do pass, este não utiliza plug-ins de síntese unitária. Essa é uma escolha que prioriza o desempenho e, por isso, abre mão da capacidade de integração oferecida por essa interface. Internamente, atualmente ele utiliza apenas o TwoQubitBasisDecomposer e o TwoQubitControlledUDecomposer para sintetizar as operações unitárias de dois qubits. Você não deve usar esse pass se precisar utilizar a interface plugável e a capacidade de usar diferentes algoritmos de síntese; em vez disso, deve usar uma combinação de ConsolidateBlocks e UnitarySynthesis para aproveitar o mecanismo de plug-ins no UnitarySynthesis.

from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import TwoQubitPeepholeOptimization
from qiskit.providers.fake_provider import GenericBackendV2

# Build an unoptimized 2 qubit circuit
unoptimized = QuantumCircuit(2)
for i in range(10):
  if i % 2:
    unoptimized.cx(0, 1)
  else:
    unoptimized.cx(1, 0)
# Generate a target with random error rates
backend = GenericBackendV2(2, ["u", "cx"], coupling_map=[[0, 1], [1, 0]])
# Instantiate pass
peephole_pass = TwoQubitPeepholeOptimization(backend.target)
# Run pass and visualize output
optimized = peephole_pass(unoptimized)
optimized.draw("mpl")
Circuito otimizado

Inicializar o passe

Parâmetros

  • alvo – O alvo para o qual a jogada será executada
  • approximation_degree – seletor heurístico utilizado para a aproximação de circuitos (aproximação de 1.0=no, aproximação de 0.0=maximal ). A aproximação pode reduzir o número de portas utilizadas nos operadores unitários sintetizados de menor dimensão, ao custo de se afastar do operador unitário original. Se None, a aproximação é feita com base nas fidelidades das portas especificadas no target.

Atributos

is_analysis_pass

Verifique se a passagem é uma passagem de análise.

Se o pass for um “ AnalysisPass, ”, isso significa que ele pode analisar o DAG e gravar os resultados dessa análise no conjunto de propriedades. Este tipo de passagem não permite modificações no DAG.

is_transformation_pass

Verifique se a etapa é uma etapa de transformação.

Se o pass for um TransformationPass,, isso significa que ele pode manipular o DAG, mas não pode modificar o conjunto de propriedades (embora possa lê-lo).


Métodos

execute

execute(passmanager_ir, state, callback=None)

GitHub

Executar tarefa de otimização para o IR do Qiskit de entrada.

Parâmetros

  • passmanager_ir (DAGCircuit) – Qiskit IR para otimização.
  • state (DAGCircuit) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passagens.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Uma função de retorno de chamada que é chamada a cada execução da tarefa de otimização.

Retorna

IR do Qiskit otimizado e situação atual do fluxo de trabalho.

Tipo de retorno

tupla [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nome da passagem.

Tipo de retorno

str

run

run(dag)

GitHub

Execute uma passagem no DAGCircuit. Isso é implementado pelo desenvolvedor do pass.

Parâmetros

dag (DAGCircuit) – o dia em que a passagem é percorrida.

Aumentos

NotImplementedError – quando isso não é implementado em uma passagem.

Tipo de retorno

DAGCircuit

update_status

update_status(state, run_state)

GitHub

Atualizar o status do fluxo de trabalho.

Parâmetros

  • state (PassManagerState) – Passe o estado do gerenciador para atualização.
  • run_state (RunState) – Status de conclusão da tarefa atual.

Retorna

Atualizou o status do gerenciador de passes.

Tipo de retorno

PassManagerState

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