Skip to main content
IBM Quantum Platform

Propagação

pauli_prop.propagation

Funções para realizar a propagação de Pauli.

RotationGates

class RotationGates(gates, qargs, thetas)

GitHub

Bases: NamedTuple

Uma representação mínima intermediária de um QuantumCircuit.

Rotações de Pauli suportadas: rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate

Criar uma nova instância de RotationGates(gates, qargs, thetas)

Parâmetros

append_circuit_instruction

append_circuit_instruction(inst, qargs, num_qubits, *, clifford=None)

GitHub

Analisa uma instrução de circuito e acrescenta seus dados às listas internas.

Parâmetros

  • inst (CircuitInstruction) – A instrução do circuito para analisar e acrescentar
  • qargs (list[int]) – A lista dos índices dos qubits da instrução no contexto de seu circuito
  • num_qubits (int) – O número de qubits do circuito que contém essa instrução
  • clifford (Clifford | None) – Um Clifford opcional pelo qual a instrução fornecida deve ser movida. O Clifford deve atuar sobre todos os qubits do circuito.

Aumentos

  • ValueError – Encontrada porta não suportada no circuito
  • ValueError – Se for fornecida, clifford deve atuar sobre todos os qubits do circuito

Tipo de retorno

Nenhum

count

count(value, /)

Retorna o número de ocorrências do valor.

gates

Tipo: list[ndarray[tuple[int,...], dtype[bool]]]

Uma representação das portas semelhante ao cálculo ZX.

index

index(value, start=0, stop=9223372036854775807, /)

Retorna o primeiro índice do valor.

Gera uma exceção ValueError se o valor não estiver presente.

qargs

Tipo: list[list[int]]

Os índices dos qubits sobre os quais cada porta atua.

thetas

Tipo: list[float]

Os ângulos de rotação de todas as portas.

circuit_to_rotation_gates

circuit_to_rotation_gates(circuit)

GitHub

Converte o circuito fornecido em uma representação intermediária.

Suporta portas de rotação de Pauli (“rx/rxx”, “ry/ryy”, “rz/rzz”, ‘PauliEvolutionGate’ ) e canais de erro de Pauli-Lindblad, especificados como instruções “ PauliLindbladError ”.

Parâmetros

circuit (QuantumCircuit) –

O circuito a ser convertido. Pode conter rotações de Pauli (rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate ) e, opcionalmente, instruções d PauliLindbladError.

Retorna

Uma instância RotationGates , caso o circuito não contenha PauliLindbladError instruções; caso contrário, é retornada uma instância NoisyRotationGates .

Aumentos

ValueError – quando é encontrado um portão não compatível em circuit.

Tipo de retorno

RotationGates | NoisyRotationGates

propagate_through_rotation_gates

propagate_through_rotation_gates(operator, rot_gates, max_terms, atol, frame)

GitHub

Propagar um operador de Pauli esparso, OO, por um circuito (representado em rot_gates), UU.

Para a propagação de Schrödinger: UOUU O U^{\dagger}. Para a propagação de Heisenberg: UOUU^{\dagger} O U.

Se for rot_gates uma NoisyRotationGates instância, o operador será propagado por cada gerador de ruído. O coeficiente associado a cada termo em cic_ioperator será amortecido de acordo com a taxa de cada gerador de erro anticomutativo, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

Em geral, a memória e o tempo necessários para a propagação por um circuito aumentam exponencialmente com o número de operações no circuito, devido ao crescimento exponencial do número de termos do operador na base de Pauli. Para regular essa dificuldade exponencial, pode-se truncar os termos de Pauli de pequena magnitude (ou seja, definir seus valores como zero), o que resulta em um viés proporcional às magnitudes dos termos truncados. Após a propagação por cada operação do circuito, os termos são truncados em relação a dois parâmetros:

  • Apenas os maiores max_terms componentes de Pauli são mantidos; quaisquer termos menores serão truncados. Essa opção permite estimar com antecedência quanto tempo e memória serão suficientes para o cálculo.
  • Os termos com magnitudes menores que atol são truncados (definidos como zero).
Nota

Essa função pré-aloca espaço na memória para o operador em tamanho real e para o buffer do operador. É de responsabilidade do chamador garantir que haja memória suficiente para armazenar os operadores que contêm termos max_terms . Quando é max_terms None, os requisitos de memória e tempo geralmente aumentam exponencialmente com o número de operações no circuito.

Parâmetros

  • operator (SparsePauliOp) – O operador a ser propagado
  • rot_gates (RotationGates | NoisyRotationGates) – Um circuito representado na forma de RotationGates.
  • max_terms (int) – O número máximo de termos que o operador pode conter à medida que é propagado
  • atol (float) – Os termos cujos coeficientes tenham magnitudes menores do que essa não serão adicionados ao operador à medida que ele for propagado. Este parâmetro não garante a precisão do operador retornado.
  • frame (str) –s para a evolução de Schrödinger h para a evolução de Heisenberg

Retorna

O operador evoluído e a norma 1 de todos os coeficientes truncados.

Aumentos

Tipo de retorno

tupla [ SparsePauliOp, float ]

propagate_through_circuit

propagate_through_circuit(operator, circuit, max_terms, atol, frame)

GitHub

Propagar um operador de Pauli esparso, OO, por um circuito, UU.

Suporta portas de rotação de Pauli (“rx/rxx”, “ry/ryy”, “rz/rzz”, ‘PauliEvolutionGate’ ) e canais de erro de Pauli-Lindblad, especificados como instruções “ PauliLindbladError ”.

Para a propagação de Schrödinger: UOUU O U^{\dagger}. Para a propagação de Heisenberg: UOUU^{\dagger} O U.

Se houver circuit instruções de ruído de Pauli-Lindblad, o operador será propagado por cada gerador de ruído. O coeficiente associado a cada termo em cic_ioperator será amortecido de acordo com a taxa de cada gerador de erro anticomutativo, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

Em geral, a memória e o tempo necessários para a propagação por um circuito aumentam exponencialmente com o número de operações no circuito, devido ao crescimento exponencial do número de termos do operador na base de Pauli. Para regular essa dificuldade exponencial, pode-se truncar os termos de Pauli de pequena magnitude (ou seja, definir seus valores como zero), o que resulta em um viés proporcional às magnitudes dos termos truncados. Após a propagação por cada operação do circuito, os termos são truncados em relação a dois parâmetros:

  • Apenas os maiores max_terms componentes de Pauli são mantidos; quaisquer termos menores serão truncados. Essa opção permite estimar com antecedência quanto tempo e memória serão suficientes para o cálculo.
  • Os termos com magnitudes menores que atol são truncados (definidos como zero).
Nota

Essa função pré-aloca espaço na memória para o operador em tamanho real e para o buffer do operador. É de responsabilidade do chamador garantir que haja memória suficiente para armazenar os operadores que contêm termos max_terms . Quando é max_terms None, os requisitos de memória e tempo geralmente aumentam exponencialmente com o número de operações no circuito.

Parâmetros

  • operator (SparsePauliOp) – O operador a ser propagado
  • circuit (QuantumCircuit) – O circuito pelo qual o operador será propagado
  • max_terms (int) – O número máximo de termos que o operador pode conter à medida que é propagado
  • atol (float) – Os termos cujos coeficientes tenham magnitudes menores do que essa não serão adicionados ao operador à medida que ele for propagado. Este parâmetro não garante a precisão do operador retornado.
  • frame (str) –s para a evolução de Schrödinger h para a evolução de Heisenberg

Retorna

O operador aprimorado

Aumentos

Tipo de retorno

tupla [ SparsePauliOp, float ]

propagate_through_operator

propagate_through_operator(op1, op2, max_terms=None, coerce_op1_traceless=False, num_leading_terms=0, frame='s', atol=0.0, search_step=4)

GitHub

Realizar a propagação de uma operadora, op1 ou OO, por meio de outra operadora, op2 ou UU.

Para a evolução de Schrödinger: UOUU O U^{\dagger}.

Para a evolução de Heisenberg: UOUU^{\dagger} O U.

A evolução é realizada na base de Pauli somando-se termos da forma UiOjUkU_i O_j U_k (ignorando o símbolo de cruz, ver nota abaixo). O número desses termos é cúbico em relação ao tamanho do operador (len( op1 ) * len( op2 )**2) e, em geral, incluirá muitos Paulis duplicados.

A definição de max_terms produz um resultado aproximado, no qual apenas os max_terms maiores termos (em magnitude do coeficiente) são calculados. Isso pode ser muito mais rápido, mas resulta em alguns erros devido ao truncamento de termos menores.

O cálculo aproximado envolve duas etapas: a busca pelos termos a serem mantidos e, em seguida, o cálculo desses termos. Aumentar consideravelmente search_step (cubicamente) acelera a busca, com um custo de precisão que costuma ser pequeno.

É possível que alguns Paulis presentes nos termos mantidos também tivessem aparecido nos termos truncados. Como esses termos truncados nunca são calculados, não há como incorporá-los aos termos mantidos que compartilham o mesmo Pauli. Assim, a função n``th-largest term in the approximate result is not guaranteed to equal the nth-largest term in the exact result. Likewise, convergence to the exact result with increasing ``max_terms pode ser não monotônica.

Nota

OO presume-se que seja hermitiana ( OjO_j = OjO_j^{\dagger} )

Parâmetros

  • op1 (SparsePauliOp) – O operador a ser propagado

  • op2 (SparsePauliOp) – O operador pelo qual se deve propagar

  • max_terms (int | None) –

    Quando não é o caso None, produz-se um resultado aproximado que inclui apenas os maiores max_terms termos do produto direto dos três operadores no espaço de Pauli.

    Quando max_terms é e None o número de qubits é < 12, the propagation will be performed in the computational basis using matrix multiplication. For systems > e a 12 qubits, todos os termos de Pauli são calculados e somados; no entanto, essa geralmente não é uma boa maneira de calcular a evolução exata, devido à presença de muitos termos duplicados.

  • coerce_op1_traceless (bool) – Um sinalizador que indica se os termos de identidade devem ser removidos do operador de saída.

  • num_leading_terms (int) – O número de termos em op1 a serem conjugados por cada termo em op2. O conjunto de termos incluídos é ampliado para incluir sua união com o conjunto de termos UiOjUiU_i O_j U_i^{\dagger}, para j<numleadingtermsj < num_leading_terms. Isso pode melhorar a precisão dos principais componentes de O na saída, com algum custo em tempo de execução.

  • frame (str) – s para a evolução de Schrödinger; h para a evolução de Heisenberg

  • atol (float) – Os termos no operador evoluído com magnitudes inferiores a atol serão truncados

  • search_step (int) – Um parâmetro que pode acelerar a pesquisa no amplíssimo espaço de 3D para identificar os maiores max_terms termos do produto. Definir esse tamanho de passo como >1 acelera essa busca por um fator de search_step**3, com um possível custo em termos de precisão. Espera-se que essa imprecisão seja pequena para search_step**3 << max_terms.

Retorna

O operador transformado

Aumentos

Tipo de retorno

SparsePauliOp

evolve_through_cliffords

evolve_through_cliffords(circuit)

GitHub

Aplique a evolução (no referencial de Schrödinger) a todas as instruções não-Clifford por meio de todas as portas de Clifford do circuito.

Isso desloca todas as portas de Clifford reconhecidas para o início do circuito e atualiza as bases das portas de rotação de Pauli (por exemplo RxGate,, RzzGate, PauliEvolutionGate) e dos canais de PauliLindbladError. Outras operações não são suportadas. Consulte a documentação em Pauli.evolve para obter mais informações sobre a evolução de Paulis por Cliffords.

O efeito é semelhante ao de acessar a imagem de interação de Clifford em arXiv:2306.04797, mas sem mapear todas as magnitudes dos ângulos de rotação para π/4\leq \pi/4.

A função retorna dois objetos que representam as partes Clifford e não-Clifford do circuito.

Parâmetros

circuit (QuantumCircuit) – O a QuantumCircuit ser transformado. Pode conter apenas portas de rotação de Pauli PauliLindbladError (anexadas ao circuito como canais quânticos) e portas de Clifford reconhecidas.

Retorna

  • Clifford — Um único Clifford de um qubit que representa a primeira parte do circuito
  • QuantumCircuit - Um circuito que contém a parte restante e transformada do circuito

Aumentos

ValueError – O circuito de entrada contém uma porta não compatível

Tipo de retorno

tupla [ Clifford, QuantumCircuit ]

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