Skip to main content
IBM Quantum Platform

QDriftTrotterization

class QDriftTrotterization(num_terms, *, filter_trivial=False, rng=None)

Bases: GenericPass[DAGCircuit, DAGCircuit]

Uma etapa de transpilagem para “Trotterizar” os gates Evolution por meio do protocolo qDRIFT.

Essa passagem substitui a evolução exata eitHe^{-i t H} de cada porta Evolution por uma fórmula de produto aleatória: ela extrai num_terms amostras dos termos do hamiltoniano (ou groups, se atribuído), sendo que cada termo é amostrado com uma probabilidade proporcional à magnitude de seu coeficiente, e emite uma Evolution porta por amostra. Cada porta amostrada evolui seu termo (de magnitude unitária e que preserva o sinal) durante o mesmo tempo

δ=λtnum_terms,λ=jcj,\delta = \frac{\lambda t}{\texttt{num\_terms}}, \qquad \lambda = \sum_j |c_j|,

onde cjc_j são os coeficientes dos termos/grupos amostrados. O produto ordenado das evoluções amostradas não reproduz exatamente eitHe^{-i t H}; em vez disso, sua esperança sobre a amostragem se aproxima da evolução exata, com um erro que diminui à medida que aumenta num_terms . Como o resultado depende dos sorteios aleatórios, ele varia de execução para execução, a menos que rng seja fornecido um valor fixo.

Sugestão

Os termos que são diagonais na base de ocupação-número (ou seja, produtos de operadores numéricos) não têm efeito sobre as sequências de bits amostradas; portanto, incluí-los apenas aumenta a sobrecarga da amostragem. Filtre-os com filter_diagonal_terms() no hamiltoniano antes de construir a Evolution porta, em vez de fazer isso a cada chamada para run(): essa etapa é executada uma vez por circuito transpilado; portanto, filtrar antecipadamente evita repetir o mesmo trabalho de filtragem para cada circuito gerado a partir do mesmo hamiltoniano.

Veja Também

O protocolo “ qDRIFT ” foi apresentado em arXiv:1811.08017.

A inicialização desta etapa do transpiler pode ser feita com os argumentos listados a seguir.

Parâmetros

  • num_terms (int) – o número de termos a serem amostrados para a trotterização de qDRIFT. Isso equivale ao número de portas Evolution emitidas por porta de entrada; um valor maior reduz o erro de trotterização, em troca de um circuito mais profundo.
  • filter_trivial (bool) – Quando configurado para True, o ciclo de amostragem rejeita um termo amostrado, a menos que ele associe um modo conhecido como ocupado a um modo conhecido como desocupado. Qualquer termo que atue apenas em um desses dois conjuntos não pode alterar a ocupação e, portanto, não tem efeito sobre uma sequência de bits amostrada; assim, o redesenho evita o desperdício de um dos espaços num_terms com ele. Isso requer que uma PrepareSlaterDeterminant porta InitializeModes ou precede as Evolution portas que serão submetidas ao processo de Trotter (para definir os conjuntos iniciais de modos ocupados e desocupados); se nenhuma for encontrada, ou se os conjuntos de modos definidos forem inteiramente ocupados ou inteiramente desocupados, a filtragem é ignorada para essa porta e, em vez disso, UserWarning é emitido um. Qualquer OrbitalRotation portão encontrado antes ou entre os portões Evolution também atualiza esses conjuntos: cada modo sobre o qual ele atua passa a ser “incerto” (já que a rotação pode misturá-lo com qualquer outro modo com o qual ele entre em contato), assim como um modo afetado por um termo de qDRIFT o aceito. Um PrepareSlaterDeterminant portão atualiza esses conjuntos da mesma forma que seus OrbitalRotation componentes e InitializeModes fariam se fossem aplicados em sequência: ele inicia os conjuntos de ocupado/desocupado a partir de seu occupation, e então marca imediatamente todos os modos sobre os quais atua como “incertos” devido à sua rotação. Consulte a docstring run() para conhecer a regra de aceitação exata.
  • rng (np.random.Generator | int | None) – o gerador de números aleatórios (RNG) a ser utilizado. Quando se tratar de um int, o gerador de números aleatórios interno será inicializado com np.random.default_rng(seed=rng).

Atributos

MAX_SAMPLE_RETRIES

Valor padrão: 1000000

O número máximo de amostras rejeitadas consecutivas que é tolerado pelo filter_trivial antes que ele run() desista e gere um RuntimeError. Isso evita um loop infinito quando os termos restantes do hamiltoniano não conseguem fazer a ponte entre os conjuntos de modos ocupados e desocupados monitorados — por exemplo, quando ambos os conjuntos permanecem pequenos e disjuntos (poucos modos foram marcados como ocupados ou desocupados, e nenhum ainda se tornou “incerto”) e o suporte de nenhum termo restante abrange ambos.

num_terms

O número de termos a serem incluídos na “ qDRIFT ” (Trotterização).

filter_trivial

Se os termos amostrados que não podem afetar a sequência de bits amostrada devem ser rejeitados (consulte a documentação da classe para obter mais informações sobre o argumento filter_trivial ).


Métodos

run

run(dag)

Executa essa etapa de transpilagem.

Cada Evolution nó é substituído por Evolution portas de um único termo num_terms amostradas (consulte a descrição da classe). Os nós que não são Evolution portas são copiados para a saída sem alterações. Como a amostragem é aleatória, o resultado varia de uma execução para outra, a menos que rng tenha sido definida uma semente.

Quando filter_trivial é definido, este método rastreia os conjuntos de modos que se sabe estarem ocupados ou desocupados, a partir de qualquer InitializeModes porta(s) que preceda(m) as Evolution portas no circuito (várias dessas portas colocadas em paralelo, por exemplo, uma por setor de spin, são acumuladas juntas). Um termo amostrado só é aceito se seu suporte intersectar ambos os conjuntos, ou seja, se associar um modo conhecido como ocupado a um conhecido como desocupado; caso contrário, ele é descartado e reamostrado, uma vez que não pode afetar a sequência de bits amostrada. Uma vez que um termo seja aceito, todos os modos que o apoiam passam a ser considerados “incertos” e são adicionados a ambos os conjuntos, tornando-o elegível para participar em qualquer uma das funções nas amostras subsequentes. Qualquer porta OrbitalRotation presente no circuito atualiza esses conjuntos da mesma maneira: cada modo sobre o qual ela atua também se torna “incerto”, já que a rotação pode misturá-lo com qualquer outro modo em seu suporte. Uma porta PrepareSlaterDeterminant lógica é tratada como se seus OrbitalRotation componentes e InitializeModes fossem aplicados em série: seu occupation primeiro componente define os conjuntos ocupado/desocupado e, em seguida, cada modo sobre o qual ela atua é imediatamente marcado como “incerto”, uma vez que ela também envolve uma rotação.

Parâmetros

dag (DAGCircuit) – o circuito de entrada com instruções baseadas em férmions. Somente DAGOpNode instâncias FermionicGate como essas são op suportadas.

Retorna

O circuito de saída, que ainda está atuando sobre um registro fermiónico.

Aumentos

RuntimeError – se for filter_trivial True e amostras consecutivas MAX_SAMPLE_RETRIES forem rejeitadas sem que se encontre um termo não trivial a ser emitido.

Tipo de retorno

DAGCircuit

Métodos herdados

execute

execute(passmanager_ir, state, callback=None)

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

Parâmetros

  • passmanager_ir (IR) – Qiskit IR para otimização.
  • state (PassManagerState) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passagens.
  • callback (Callable[[Task, IR_OUT, 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 [ IR_OUT, PassManagerState ]

name

name()

Nome da passagem.

Tipo de retorno

str

update_status

update_status(state, run_state)

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 senhas.

Tipo de retorno

PassManagerState

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