PauliEvolutionGate
class qiskit.circuit.library.PauliEvolutionGate(operator, time=1.0, label=None, synthesis=None)
Bases: Gate
Evolução temporal de um operador que consiste em Paulis.
Para um operador hermitiano que consiste em termos de Pauli e tempo de evolução (real) , essa porta representa a unidade
As portas de evolução estão relacionadas às portas de rotação de Pauli por um fator de 2. Por exemplo, a evolução temporal do operador Pauli está conectada à rotação Pauli por
Compilação:
Essa porta representa a evolução exata . Entretanto, a implementação exata dessa operação geralmente requer um número exponencial de portas. Portanto, o compilador normalmente implementa uma aproximação do unitário , por exemplo, usando uma fórmula de produto como a definida por LieTrotter. Ao passar o argumento synthesis , você pode especificar qual método o compilador deve usar; consulte qiskit.synthesis para ver as opções disponíveis.
Observe que a ordem em que a aproximação e métodos como control() e power() são chamados. A alteração da ordem pode resultar em unidades diferentes.
Verificações de comutação:
O Qiskit suporta verificações eficientes de comutação de PauliEvolutionGate instâncias com outros portões baseados em Pauli, como PauliGate ou PauliProductMeasurement. No entanto, essas verificações exigem a conversão do operador para SparseObservable o formato, portanto, recomendamos fortemente a criação de operadores usando essa classe de operadores se for esperado um grande número de verificações de comutação (por exemplo, se você tiver um circuito com um grande número de sequências PauliEvolutionGate).
Exemplos:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
X = SparsePauliOp("X")
Z = SparsePauliOp("Z")
I = SparsePauliOp("I")
# build the evolution gate
operator = (Z ^ Z) - 0.1 * (X ^ I)
evo = PauliEvolutionGate(operator, time=0.2)
# plug it into a circuit
circuit = QuantumCircuit(2)
circuit.append(evo, range(2))
print(circuit.draw())O resultado acima será impresso (observe que o coeficiente -0.1 não é impresso!):
┌──────────────────────────┐
q_0: ┤0 ├
│ exp(-it (ZZ + XI))(0.2) │
q_1: ┤1 ├
└──────────────────────────┘Referências
[1] G. Li et al. Paulihedral: A Generalized Block-Wise Compiler Optimization Framework For Quantum Simulation Kernels (2021). arXiv:2109.03371
Parâmetros
- operator (qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable |list[qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable]) – O operador para evoluir. Também pode ser fornecido como uma lista de operadores não comutáveis em que os elementos são somas de operadores comutáveis. Por exemplo:
[XY + YX, ZZ + ZI + IZ, YY]. - time (ParameterValueType) – O tempo de evolução.
- label (str | None) – Um rótulo para o portão a ser exibido nas visualizações. Por padrão, o rótulo é definido como
exp(-it <operators>), em que<operators>é a soma dos Paulis. Observe que o rótulo não inclui nenhum coeficiente de Paulis. Consulte a documentação da classe para obter um exemplo. - synthesis (EvolutionSynthesis | None) – Uma estratégia de síntese. Se for None, a síntese padrão será a fórmula do produto Lie-Trotter com uma única repetição.
Atributos
base_class
Obtém a classe base dessa instrução. É garantido que isso esteja na árvore de herança de self.
A "classe base" de uma instrução é a classe mais baixa em sua árvore de herança com a qual o objeto deve ser considerado totalmente compatível para aplicativos de circuito. Isso normalmente significa que a subclasse é definida apenas para oferecer algum tipo de conveniência ao programador em relação à classe base, e a classe base é a classe "verdadeira" em uma perspectiva comportamental. Em particular, você não deve substituir base_class se estiver definindo uma versão personalizada de uma instrução que será implementada de forma diferente pelo hardware, como uma estratégia de medição alternativa ou uma versão de uma porta parametrizada com um conjunto específico de parâmetros para fins de distinção em um Target da porta parametrizada completa.
Isso geralmente é exatamente equivalente a type(obj), exceto no caso de instâncias únicas de instruções de biblioteca padrão. Essas instâncias singleton são subclasses especiais de sua classe base, e essa propriedade retornará essa base. Por exemplo:
>>> isinstance(XGate(), XGate)
True
>>> type(XGate()) is XGate
False
>>> XGate().base_class is XGate
TrueEm geral, não se deve confiar na classe precisa de uma instrução; em um determinado circuito, espera-se que Instruction.name seja um discriminador mais adequado na maioria das situações.
decompositions
Obtenha as decomposições da instrução no site SessionEquivalenceLibrary.
definition
Definição de retorno em termos de outros portões básicos.
label
Etiqueta de instruções de devolução
mutable
Essa instância é uma instância única mutável ou não.
Se esse atributo for False , a instância do portão será um singleton compartilhado e não será mutável.
name
Retorna o nome.
num_clbits
Retorna o número de clbits.
num_qubits
Retorna o número de qubits.
params
Os parâmetros do site Instruction. O ideal é que sejam ângulos de portão.
time
Retorna o tempo de evolução conforme armazenado nos parâmetros da porta.
Retorna
O tempo de evolução.
Métodos
add_decomposition
add_decomposition(decomposition)
Adicione uma decomposição da instrução ao site SessionEquivalenceLibrary.
broadcast_arguments
broadcast_arguments(qargs, cargs)
Validação e manipulação dos argumentos e seu relacionamento.
Por exemplo, cx([q[0],q[1]], q[2]) significa cx(q[0], q[2]); cx(q[1], q[2]). Esse método produz os argumentos no agrupamento correto. No exemplo dado:
in: [[q[0],q[1]], q[2]],[]
outs: [q[0], q[2]], []
[q[1], q[2]], []As regras gerais de transmissão são:
Se len(qargs) == 1:
[q[0], q[1]] -> [q[0]],[q[1]]Se len(qargs) == 2:
[[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]] [[q[0]], [r[0], r[1]]] -> [q[0], r[0]], [q[0], r[1]] [[q[0], q[1]], [r[0]]] -> [q[0], r[0]], [q[1], r[0]]Se len(qargs) >= 3:
[q[0], q[1]], [r[0], r[1]], ...] -> [q[0], r[0], ...], [q[1], r[1], ...]
Parâmetros
- qargs (list) – Lista de argumentos de bits quânticos.
- cargs (list) – Lista de argumentos clássicos de bits.
Retorna
Uma tupla com argumentos únicos.
Aumentos
CircuitError - Se a entrada não for válida. Por exemplo, o número de argumentos não corresponde à expectativa da porta.
Tipo de retorno
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
Retorna a versão controlada de si mesmo.
O resultado é a versão controlada especificada de . O portão retornado representa , em que é o operador original , tensionado com os projetores e (dependendo do estado de controle).
A porta controlada é implementada como PauliEvolutionGate, independentemente do valor de annotated.
Parâmetros
- num_ctrl_qubits (int) – Número de controles a serem adicionados. Padroniza para
1. - label (str | None) – Uma etiqueta para a porta de evolução de Pauli resultante, para exibição em visualizações. Por padrão, o rótulo é definido como
exp(-it <operators>)onde<operators>é a soma dos Paulis. Observe que o rótulo não inclui nenhum coeficiente de Paulis. Veja a string de documentação da classe para um exemplo. - ctrl_state (int |str | None) – O estado de controle da porta, especificado como um número inteiro ou uma sequência de bits (por exemplo,
"110"). SeNone, o padrão é o estado em que todos os bits estão2**num_ctrl_qubits - 1definidos como 1. - annotated (bool | None) – Ignorado.
Retorna
Uma versão controlada deste portão.
Tipo de retorno
copy
copy(name=None)
Cópia da instrução.
Parâmetros
name (str) – nome a ser dado ao circuito copiado; se for None , o nome permanecerá o mesmo.
Retorna
uma cópia da instrução atual, com o nome atualizado, caso tenha sido fornecido
Tipo de retorno
inverse
inverse(annotated=False)
Retorna o inverso, que é obtido invertendo-se o sinal do tempo de evolução.
Parâmetros
annotated (bool)
is_parameterized
power
power(exponent, annotated=False)
Eleve esse portão ao poder de exponent.
O resultado representa onde é igual a exponent.
Parâmetros
- exponent (float) – O poder de elevar o portão para.
- annotated (bool) – Não se aplica a esta classe. Normalmente, quando isso é
True, retornamos umAnnotatedOperationcom um modificador de potência definido em vez de umGate. No entanto, podemos representar eficientemente as potências das evoluções de Pauli comoPauliEvolutionGateque é usado aqui.
Retorna
Uma operação que implementa gate^exponent.
Tipo de retorno
repeat
repeat(n)
Cria uma instrução com self repetido vezes.
Parâmetros
n (int) – Número de vezes para repetir a instrução
Retorna
Contendo a definição.
Tipo de retorno
Aumentos
CircuitError - Se n < 1.
reverse_ops
reverse_ops()
Para uma instrução composta, inverta a ordem das subinstruções.
Isso é feito por meio da inversão recursiva de todas as subinstruções. Ele não inverte nenhuma porta.
Retorna
uma nova instrução com
subinstruções invertidas.
Tipo de retorno
soft_compare
soft_compare(other)
Comparação suave entre portões. Seus nomes, número de qubits e números de bits clássicos devem corresponder. O número de parâmetros deve corresponder. Cada parâmetro é comparado. Se a pessoa for um ParameterExpression, isso não será levado em conta.
Parâmetros
other (instruction) – outras instruções.
Retorna
são iguais a si mesmo e a outro até as expressões de parâmetro.
Tipo de retorno
to_matrix
to_matrix()
Retorna a matriz como numpy.ndarray.
Retorna
A matriz que esse portão representa.
Aumentos
ValueError - Se os parâmetros de time não forem numéricos.
Tipo de retorno
to_mutable
to_mutable()
Retorna uma cópia mutável desse portão.
Esse método retornará uma nova cópia mutável dessa instância de porta. Se uma instância singleton estiver sendo usada, essa será uma nova instância exclusiva que poderá ser alterada. Se a instância já for mutável, ela será uma cópia profunda dessa instância.
validate_parameter
validate_parameter(parameter)
Os parâmetros do gate devem ser int, float ou ParameterExpression
Parâmetros
parameter (ParameterExpression |float)
Tipo de retorno