Propagação
pauli_prop.propagation
Funções para realizar a propagação de Pauli.
RotationGates
class RotationGates(gates, qargs, thetas)
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)
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,
clifforddeve 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
thetas
circuit_to_rotation_gates
circuit_to_rotation_gates(circuit)
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)
Propagar um operador de Pauli esparso, , por um circuito (representado em rot_gates), .
Para a propagação de Schrödinger: . Para a propagação de Heisenberg: .
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 operator será amortecido de acordo com a taxa de cada gerador de erro anticomutativo, : .
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_termscomponentes 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
atolsão truncados (definidos como zero).
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) –
spara a evolução de Schrödingerhpara a evolução de Heisenberg
Retorna
O operador evoluído e a norma 1 de todos os coeficientes truncados.
Aumentos
- ValueError – não
frameé nem nemhs. - ValueError – é
atolnegativo. - ValueError – não
max_termsé positivo.
Tipo de retorno
tupla [ SparsePauliOp, float ]
propagate_through_circuit
propagate_through_circuit(operator, circuit, max_terms, atol, frame)
Propagar um operador de Pauli esparso, , por um circuito, .
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: . Para a propagação de Heisenberg: .
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 operator será amortecido de acordo com a taxa de cada gerador de erro anticomutativo, : .
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_termscomponentes 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
atolsão truncados (definidos como zero).
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) –
spara a evolução de Schrödingerhpara a evolução de Heisenberg
Retorna
O operador aprimorado
Aumentos
- ValueError – não
frameé nem nemhs. - ValueError – é
atolnegativo. - ValueError – não
max_termsé positivo.
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)
Realizar a propagação de uma operadora, op1 ou , por meio de outra operadora, op2 ou .
Para a evolução de Schrödinger: .
Para a evolução de Heisenberg: .
A evolução é realizada na base de Pauli somando-se termos da forma (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.
presume-se que seja hermitiana ( = )
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 maioresmax_termstermos do produto direto dos três operadores no espaço de Pauli.Quando
max_termsé eNoneo 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
op1a serem conjugados por cada termo emop2. O conjunto de termos incluídos é ampliado para incluir sua união com o conjunto de termos , para . 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
atolserã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_termstermos do produto. Definir esse tamanho de passo como >1 acelera essa busca por um fator desearch_step**3, com um possível custo em termos de precisão. Espera-se que essa imprecisão seja pequena parasearch_step**3 << max_terms.
Retorna
O operador transformado
Aumentos
- ValueError – não
frameé nem nemsh. - ValueError – não
search_stepé positivo. - ValueError – contém
max_termsum valor inválido.
Tipo de retorno
evolve_through_cliffords
evolve_through_cliffords(circuit)
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 .
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 ]