SparsePauliOp
class qiskit.quantum_info.SparsePauliOp(data, coeffs=None, *, ignore_pauli_phase=False, copy=True)
Bases: LinearOp
Operador N-qubit esparso em uma representação de base Pauli.
Essa é uma representação esparsa de uma matriz de N qubits Operator em termos de N-qubit PauliList e coeficientes complexos.
Ele pode ser usado para realizar a aritmética do operador para centenas de qubits se o número de termos de base Pauli diferentes de zero for suficientemente pequeno.
Os componentes da base de Pauli são armazenados como um objeto PauliList e podem ser acessados usando o atributo paulis atributo. Os coeficientes são armazenados como um vetor de matriz Numpy complexo e podem ser acessados usando o atributo coeffs atributo.
Tipo de dados dos coeficientes
O padrão dtype da matriz interna coeffs Numpy é complex128. Os usuários podem configurar isso passando np.ndarray com um dtype diferente. Por exemplo, um SparsePauliOp parametrizado pode ser feito da seguinte forma:
>>> import numpy as np
>>> from qiskit.circuit import ParameterVector
>>> from qiskit.quantum_info import SparsePauliOp>>> SparsePauliOp(["II", "XZ"], np.array(ParameterVector("a", 2)))
SparsePauliOp(['II', 'XZ'],
coeffs=[ParameterExpression(1.0*a[0]), ParameterExpression(1.0*a[1])])Parametrizado SparsePauliOp não é compatível com os seguintes métodos:
to_matrix(sparse=True)poisscipy.sparsenão pode ter objetos como elementos.to_operator()poisOperatornão oferece suporte a objetos.sort,argsort, poisParameterExpressionnão oferece suporte à comparação.equivjá queParameterExpressionnão pode ser convertido em complexo.choppoisParameterExpressionnão oferece suporte a valores absolutos.
Inicializa um objeto operador.
Parâmetros
-
data (PauliList orSparsePauliOp orPauli orlist orstr) – Lista de termos da Pauli. Uma lista de cadeias de caracteres Pauli ou uma cadeia de caracteres Pauli também é permitida.
-
coeffs (np.ndarray) –
coeficientes complexos para termos de Pauli.
NotaSe
datafor umSparsePauliOpecoeffsnão forNone, o valor deSparsePauliOp.coeffsserá ignorado, e somente o argumento de palavra-chave passadocoeffsserá usado. -
ignore_pauli_phase (bool) – Se for verdadeiro, qualquer
phasecomponente de um determinado valorPauliListserá considerado nulo. Isso é mais eficiente nos casos em que umPauliListfoi construído exclusivamente para esse fim, e já se sabe que as fases na convenção ZX são nulas. Só faz sentido passar essa opção ao fornecerPauliListdados. (Padrão: False) -
copy (bool) – copie os dados de entrada se for True; caso contrário, atribua-os diretamente, se possível. (Padrão: True)
Aumentos
QiskitError - Se os dados de entrada ou os coeficientes forem inválidos.
Atributos
atol
Valor Padrão: 1e-08
coeffs
Retorna os coeficientes de Pauli.
dim
Retorna uma tupla (input_shape, output_shape).
num_qubits
Retorna o número de qubits se for um operador N-qubit ou None caso contrário.
parameters
Retorna o Parameters livre nos coeficientes.
paulis
Devolva o PauliList.
qargs
Retorna os qargs do operador.
rtol
Valor Padrão: 1e-05
settings
Configurações de retorno.
size
O número de termos Pauli de Pauli no operador.
Métodos
adjoint
apply_layout
apply_layout(layout, num_qubits=None)
Aplique um layout de transpilador a isso SparsePauliOp
Parâmetros
- layout (TranspileLayout |list[int] | None) – Um valor
TranspileLayout, uma lista de números inteiros ou None. Se tanto layout quanto num_qubits forem nulos, é retornada uma cópia do operador. - num_qubits (int | None) – O número de qubits para os quais o operador deve ser expandido. Se não for fornecido, se
layoutfor umTranspileLayouto número de qubits do circuito de saída do transpilador será usado por padrão. Selayoutfor uma lista de números inteiros, a permutação especificada será aplicada sem nenhuma expansão. Se o layout for None (Nenhum), o operador será expandido para o número de qubits fornecido.
Retorna
Um novo SparsePauliOp com o layout fornecido aplicado
Tipo de retorno
argsort
argsort(weight=False)
Retorna índices para classificar as linhas da tabela.
Retorna a composição de permutações na ordem de classificação por coeficiente e classificação por Pauli. Ao usar o kwarg de peso, a saída também pode ser classificada pelo número de termos não idênticos no Pauli, em que o conjunto de todos os Pauli's de um determinado peso ainda é ordenado lexicograficamente.
Exemplo
Aqui está um exemplo de como usar o SparsePauliOp argsort.
import numpy as np
from qiskit.quantum_info import SparsePauliOp
# 2-qubit labels
labels = ["XX", "XX", "XX", "YI", "II", "XZ", "XY", "XI"]
# coeffs
coeffs = [2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j]
# init
spo = SparsePauliOp(labels, coeffs)
print('Initial Ordering')
print(spo)
# Lexicographic Ordering
srt = spo.argsort()
print('Lexicographically sorted')
print(srt)
# Lexicographic Ordering
srt = spo.argsort(weight=False)
print('Lexicographically sorted')
print(srt)
# Weight Ordering
srt = spo.argsort(weight=True)
print('Weight sorted')
print(srt)Initial Ordering
SparsePauliOp(['XX', 'XX', 'XX', 'YI', 'II', 'XZ', 'XY', 'XI'],
coeffs=[2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j])
Lexicographically sorted
[4 7 0 1 2 6 5 3]
Lexicographically sorted
[4 7 0 1 2 6 5 3]
Weight sorted
[4 7 3 0 1 2 6 5]Parâmetros
- weight (bool) – classificar opcionalmente por peso se for True (Padrão: False).
- sorted (By using the weight kwarg the output can additionally be)
- Pauli. (by the number of non-identity terms in the)
Retorna
os índices para classificar a tabela.
Tipo de retorno
assign_parameters
assign_parameters(parameters, inplace=False)
Vincule os Parameters livres nos coeficientes aos valores fornecidos.
Se todos os parâmetros do circuito estiverem vinculados a valores numéricos, a matriz de coeficientes será retornada com um complex dtype.
Parâmetros
- parameters (Mapping[Parameter, complex |ParameterExpression] | Sequence[complex |ParameterExpression]) – Os valores aos quais os parâmetros serão vinculados.
- inplace (bool) – Se
False, uma cópia do operador com os parâmetros vinculados será retornada. SeTrue, o próprio operador é modificado.
Retorna
Uma cópia do operador com parâmetros vinculados, se inplace for False, caso contrário, None.
Tipo de retorno
SparsePauliOp | Nenhum
chop
chop(tol=1e-14)
Defina as partes reais e imaginárias dos coeficientes como 0 se < tol em magnitude.
Por exemplo, o operador que representa 1+1e-17j X + 1e-17 Y com uma tolerância maior que 1e-17 será reduzido para 1 X , enquanto SparsePauliOp.simplify() retornaria 1+1e-17j X.
Se tanto a parte real quanto a imaginária de um coeficiente forem 0 após o truncamento, o Pauli correspondente é removido do operador.
Parâmetros
tol (float) – A tolerância absoluta para verificar se uma parte real ou imaginária deve ser definida como 0.
Retorna
Esse operador com coeficientes cortados.
Tipo de retorno
compose
compose(other, qargs=None, front=False)
Retorna a composição do operador com outro SparsePauliOp.
Parâmetros
- other (SparsePauliOp) – um objeto SparsePauliOp.
- qargs (list or None) – uma lista de posições do subsistema às quais aplicar outras. Se None for aplicado a todos os subsistemas (padrão: None).
- front (bool) – Se True, compor usando o operador multiplicação à direita, em vez de multiplicação à esquerda [, padrão: False].
Retorna
O composto SparsePauliOp.
Tipo de retorno
Aumentos
QiskitError - se outro não puder ser convertido em um operador ou tiver dimensões incompatíveis para os subsistemas especificados.
Por padrão, a composição (&) é definida como multiplicação de matriz à esquerda para operadores de matriz, enquanto @ (equivalente a dot()) é definida como multiplicação de matriz à direita. Ou seja, A & B == A.compose(B) é equivalente a B @ A == B.dot(A) quando A e B são do mesmo tipo.
A configuração do kwarg front=True muda isso para multiplicação de matriz à direita e é equivalente ao método dot() método A.dot(B) == A.compose(B, front=True).
conjugate
copy
dot
dot(other, qargs=None)
Retorna o operador multiplicado à direita self * other.
Parâmetros
- other (Operator) – um objeto operador.
- qargs (list or None) – uma lista de posições do subsistema às quais aplicar outras. Se None for aplicado a todos os subsistemas (padrão: None).
Retorna
A matriz correta multiplicou o Operator.
Tipo de retorno
O produto escalar pode ser obtido usando o operador binário @ . Portanto, a.dot(b) é equivalente a a @ b.
equiv
equiv(other, atol=None)
Verifique se dois operadores SparsePauliOp são equivalentes.
Parâmetros
- other (SparsePauliOp) – um objeto operador.
- atol (float | None) – Tolerância numérica absoluta para verificar a equivalência.
Retorna
Verdadeiro se o operador for equivalente a self.
Tipo de retorno
expand
expand(other)
Retorna o produto tensorial de ordem inversa com outro SparsePauliOp.
Parâmetros
other (SparsePauliOp) – um objeto SparsePauliOp.
Retorna
o produto tensorial , onde
é o atual SparsePauliOp, e é o outro SparsePauliOp.
Tipo de retorno
from_list
static from_list(obj, dtype=None, *, num_qubits=None)
Construa a partir de uma lista de cadeias e coeficientes de Pauli.
Por exemplo, o Hamiltoniano de 5 qubits
pode ser construído como
from qiskit.quantum_info import SparsePauliOp
# via tuples and the full Pauli string
op = SparsePauliOp.from_list([("XIIZI", 1), ("IYIIY", 2)])Parâmetros
- obj (Iterable[Tuple[str, complex]]) – A lista de 2 tuplas que especificam os termos de Pauli.
- dtype (type | None) – Tipo de dados dos coeficientes. Se
None(padrão), o tipo de dados é inferido automaticamente. - num_qubits (int) – O número de qubits do operador (Padrão: Nenhum).
Retorna
A representação SparsePauliOp dos termos de Pauli.
Tipo de retorno
Aumentos
- QiskitError - Se uma lista vazia for passada e num_qubits for None.
- QiskitError - Se num_qubits e os objetos na lista de entrada não corresponderem.
from_operator
static from_operator(obj, atol=None, rtol=None)
Criar a partir de um objeto Operator.
Observe que o custo dessa construção é exponencial em geral, pois o número de termos de Pauli possíveis na decomposição é exponencial no número de qubits.
Internamente, isso usa uma implementação da "decomposição tensorizada de Pauli" apresentada em Hantzko, Binkowski e Gupta (2023).
Parâmetros
- obj (Operator) – um operador N-qubit.
- atol (float) – Opcional. Tolerância absoluta para verificar se os coeficientes são zero (Padrão: 1e-8 ). Como a comparação é com zero, de fato a tolerância usada é a máxima de
atolertol. - rtol (float) – Opcional. tolerância relativa para verificar se os coeficientes são zero (Padrão: 1e-5 ). Como a comparação é com zero, de fato a tolerância usada é a máxima de
atolertol.
Retorna
a representação SparsePauliOp do operador.
Tipo de retorno
Aumentos
QiskitError - se o operador de entrada não for um operador N-qubit.
from_sparse_list
static from_sparse_list(obj, num_qubits, do_checks=True, dtype=None)
Construa a partir de uma lista de cadeias de Pauli locais e coeficientes.
Cada elemento da lista é uma tripla de uma cadeia de Pauli local, índices onde aplicá-la e um coeficiente.
Por exemplo, o Hamiltoniano de 5 qubits
pode ser construído como
from qiskit.quantum_info import SparsePauliOp
# via triples and local Paulis with indices
op = SparsePauliOp.from_sparse_list([("ZX", [1, 4], 1), ("YY", [0, 3], 2)], num_qubits=5)
# equals the following construction from "dense" Paulis
op = SparsePauliOp.from_list([("XIIZI", 1), ("IYIIY", 2)])Parâmetros
- obj (Iterable[tuple[str, list[int], complex]]) – A lista de 3 tuplas especificando a Paulis.
- num_qubits (int) – O número de qubits do operador.
- do_checks (bool) – Se deve ser realizada uma verificação de validade nos índices de entrada.
- dtype (type | None) – Tipo de dados dos coeficientes. Se
None(padrão), o tipo de dados é inferido automaticamente.
Retorna
A representação SparsePauliOp dos termos de Pauli.
Tipo de retorno
Aumentos
- QiskitError - Se o número de qubits for incompatível com os índices dos termos de Pauli.
- QiskitError - Se o qubit designado já estiver atribuído.
from_sparse_observable
static from_sparse_observable(obs)
Inicializar a partir de um SparseObservable.
A SparseObservable pode representar eficientemente projetores de estado próprio (como ), mas a SparsePauliOp não pode. Se a entrada obs tiver projetores de um único qubit, o resultado SparsePauliOp resultante usará termos, que é uma representação exponencialmente cara que pode esgotar rapidamente a memória.
Parâmetros
obs (SparseObservable) – O SparseObservable para converter.
Retorna
A SparsePauliOp versão do observável.
Tipo de retorno
group_commuting
group_commuting(qubit_wise=False)
Particionar um SparsePauliOp em conjuntos de cadeias Pauli comutáveis.
Parâmetros
qubit_wise (bool) –
se a regra de comutação é aplicada a todo o operador ou em uma base por qubit. Por exemplo:
>>> from qiskit.quantum_info import SparsePauliOp
>>> op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ",2j), ("ZZ",1j)])
>>> op.group_commuting()
[SparsePauliOp(["IZ", "ZZ"], coeffs=[0.+2.j, 0.+1j]),
SparsePauliOp(["XX", "YY"], coeffs=[2.+0.j, 1.+0.j])]
>>> op.group_commuting(qubit_wise=True)
[SparsePauliOp(['XX'], coeffs=[2.+0.j]),
SparsePauliOp(['YY'], coeffs=[1.+0.j]),
SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j])]Retorna
Lista de SparsePauliOp onde cada SparsePauliOp contém
operadores Pauli comutantes.
Tipo de retorno
lista [ SparsePauliOp ]
input_dims
input_dims(qargs=None)
Retorna uma tupla de dimensão de entrada para os subsistemas especificados.
is_unitary
is_unitary(atol=None, rtol=None)
Retorna True se o operador for uma matriz unitária.
Esse método verifica se o operador composto com seu adjunto é igual à identidade, até a tolerância fornecida. A tolerância é usada ao simplificar o operador composto e verificar se o resultado é a identidade.
Parâmetros
- atol (float) – Opcional. Tolerância absoluta para verificar se os coeficientes são zero (Padrão: 1e-8 ).
- rtol (float) – Opcional. Tolerância relativa para verificar se os coeficientes são zero (Padrão: 1e-5 ).
Retorna
Verdadeiro se o operador for unitário, Falso caso contrário.
Tipo de retorno
label_iter
label_iter()
Retorna um iterador de representação de rótulos.
Esse é um iterador preguiçoso que converte cada termo no site SparsePauliOp em uma tupla (rótulo, coeff). Para converter a tabela inteira em rótulos, use o método to_labels() .
Retorna
objeto iterador de rótulos para o site SparsePauliOp.
Tipo de retorno
LabelIterator
matrix_iter
matrix_iter(sparse=False)
Retorna um iterador de representação de matriz.
Esse é um iterador preguiçoso que converte cada termo no site SparsePauliOp em uma matriz à medida que é usado. Para converter em uma única matriz, use o método to_matrix() método.
Parâmetros
sparse (bool) – opcionalmente, retorna matrizes CSR esparsas se True; caso contrário, retorna matrizes em forma de matriz Numpy (Padrão: False)
Retorna
objeto iterador de matriz para PauliList.
Tipo de retorno
MatrixIterator
noncommutation_graph
noncommutation_graph(qubit_wise)
Crie o gráfico de não comutação deste SparsePauliOp.
Isso transforma o problema de agrupamento do operador de medição em um problema de coloração de gráfico. O gráfico construído contém um nó para cada Pauli. Os nós serão conectados para quaisquer dois termos de Pauli que não _not_ comutam.
Parâmetros
qubit_wise (bool) – se a regra de comutação é aplicada a todo o operador ou em uma base por qubit.
Retorna
o gráfico de não comutação com nós para cada Pauli e bordas
indicando uma relação de não comutação. Cada nó conterá o índice do termo de Pauli ao qual corresponde em seus dados. As bordas do gráfico não contêm dados.
Tipo de retorno
output_dims
output_dims(qargs=None)
Retorna uma tupla de dimensão de saída para os subsistemas especificados.
power
power(n)
Retorna a composição de um operador consigo mesmo n vezes.
Parâmetros
n (int) – o número de vezes para compor com o self ( n>0 ).
Retorna
o operador composto n vezes.
Tipo de retorno
Aumentos
QiskitError - se as dimensões de entrada e saída do operador não forem iguais ou se a potência não for um número inteiro positivo.
reshape
reshape(input_dims=None, output_dims=None, num_qubits=None)
Retorna uma cópia superficial com dimensões reformuladas do subsistema de entrada e saída.
Parâmetros
- input_dims (None or tuple) – novas dimensões de entrada do subsistema. Se for None (Nenhum), as dimensões de entrada originais serão preservadas [Padrão: Nenhum].
- output_dims (None or tuple) – novas dimensões de saída do subsistema. Se for None (Nenhum), os dims de saída originais serão preservados [Padrão: Nenhum].
- num_qubits (None or int) – remodelar para um operador N-qubit [Padrão: Nenhum].
Retorna
retorna self com dimensões de entrada e saída remodeladas.
Tipo de retorno
BaseOperator
Aumentos
QiskitError - se o tamanho combinado de todas as dimensões de entrada do subsistema ou de saída do subsistema não for constante.
simplify
simplify(atol=None, rtol=None)
Simplifique o site PauliList combinando duplicatas e removendo zeros.
Parâmetros
- atol (float) – Opcional. Tolerância absoluta para verificar se os coeficientes são zero (Padrão: 1e-8 ).
- rtol (float) – Opcional. tolerância relativa para verificar se os coeficientes são zero (Padrão: 1e-5 ).
Retorna
o operador SparsePauliOp simplificado.
Tipo de retorno
sort
sort(weight=False)
Classifique as linhas da tabela.
Depois de classificar os coeficientes usando o argsort do numpy, classifique por Pauli. A classificação de Pauli tem precedência. Se Pauli for o mesmo, ele será classificado por coeficiente. Ao usar o kwarg de peso, a saída também pode ser classificada pelo número de termos não idênticos no Pauli, em que o conjunto de todos os Pauli's de um determinado peso ainda é ordenado lexicograficamente.
Exemplo
Aqui está um exemplo de como usar o SparsePauliOp sort.
import numpy as np
from qiskit.quantum_info import SparsePauliOp
# 2-qubit labels
labels = ["XX", "XX", "XX", "YI", "II", "XZ", "XY", "XI"]
# coeffs
coeffs = [2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j]
# init
spo = SparsePauliOp(labels, coeffs)
print('Initial Ordering')
print(spo)
# Lexicographic Ordering
srt = spo.sort()
print('Lexicographically sorted')
print(srt)
# Lexicographic Ordering
srt = spo.sort(weight=False)
print('Lexicographically sorted')
print(srt)
# Weight Ordering
srt = spo.sort(weight=True)
print('Weight sorted')
print(srt)Initial Ordering
SparsePauliOp(['XX', 'XX', 'XX', 'YI', 'II', 'XZ', 'XY', 'XI'],
coeffs=[2.+1.j, 2.+2.j, 3.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j])
Lexicographically sorted
SparsePauliOp(['II', 'XI', 'XX', 'XX', 'XX', 'XY', 'XZ', 'YI'],
coeffs=[4.+0.j, 7.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j, 3.+0.j])
Lexicographically sorted
SparsePauliOp(['II', 'XI', 'XX', 'XX', 'XX', 'XY', 'XZ', 'YI'],
coeffs=[4.+0.j, 7.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j, 3.+0.j])
Weight sorted
SparsePauliOp(['II', 'XI', 'YI', 'XX', 'XX', 'XX', 'XY', 'XZ'],
coeffs=[4.+0.j, 7.+0.j, 3.+0.j, 2.+1.j, 2.+2.j, 3.+0.j, 6.+0.j, 5.+0.j])Parâmetros
- weight (bool) – classificar opcionalmente por peso se for True (Padrão: False).
- sorted (By using the weight kwarg the output can additionally be)
- Pauli. (by the number of non-identity terms in the)
Retorna
uma cópia ordenada da tabela original.
Tipo de retorno
sum
static sum(ops)
Soma de SparsePauliOps.
Essa é uma versão especializada da função sum integrada para SparsePauliOp com menor sobrecarga.
Parâmetros
ops (list[SparsePauliOp]) – uma lista de SparsePauliOps.
Retorna
o SparsePauliOp que representa a soma da lista de entrada.
Tipo de retorno
Aumentos
- QiskitError - se a lista de entrada estiver vazia.
- QiskitError - se a lista de entrada incluir um objeto que não seja SparsePauliOp.
- QiskitError - se os números de qubits dos objetos na lista de entrada não corresponderem.
tensor
tensor(other)
Retorna o produto tensorial com outro SparsePauliOp.
Parâmetros
other (SparsePauliOp) – um objeto SparsePauliOp.
Retorna
o produto tensorial , onde
é o atual SparsePauliOp, e é o outro SparsePauliOp.
Tipo de retorno
O produto tensor pode ser obtido usando o operador binário ^ . Portanto, a.tensor(b) é equivalente a a ^ b.
to_list
to_list(array=False)
Converta em uma lista de rótulos e coeficientes da cadeia de Pauli.
Para operadores com muitos termos, a conversão usando o array=True kwarg será mais eficiente, pois aloca antecipadamente a memória para a matriz completa de rótulos do Numpy.
Parâmetros
array (bool) – retorna uma matriz Numpy se for True; caso contrário, retorna uma lista (Padrão: False).
Retorna
Lista de pares (rótulo, coeff) para linhas do site PauliList.
Tipo de retorno
to_matrix
to_matrix(sparse=False, force_serial=False)
Converter em uma matriz densa ou esparsa.
Parâmetros
- sparse (bool) – se
Trueretornar uma matriz CSR esparsa; caso contrário, retornar uma matriz Numpy densa (o padrão). - force_serial (bool) – se
True, use uma implementação sem threads, independentemente do estado das variáveis de ambiente de controle de threading do Qiskit. Por padrão, isso usará o paralelismo com threads nas CPUs disponíveis.
Retorna
Uma matriz densa se sparse=False. csr_matrix: Uma matriz esparsa no formato CSR se sparse=True.
Tipo de retorno
to_operator
to_sparse_list
to_sparse_list()
Converta para um formato de lista Pauli esparsa com elementos (pauli, qubits, coeficiente).