PauliLindbladMap
class qiskit.quantum_info.PauliLindbladMap(data, /, num_qubits=None)
Bases: object
Um mapa de Pauli Lindblad armazenado em um formato qubit-esparso.
matemática
Um mapa Pauli-Lindblad é um mapa linear que atua em matrizes de densidade em -qubits da forma:
onde é um subconjunto de -qubit operadores de Pauli, e as taxas, ou coeficientes, são números reais. Quando todas as taxas são não negativas, isso corresponde a um mapeamento completamente positivo e que preserva o traço. A soma na função exponencial é chamada de gerador, e cada termo individual é chamado de gerador. Para simplificar a notação no restante da documentação, denotamos que
Representação de quase-probabilidade
O mapa pode ser escrito como um produto:
Para cada , é válido que
onde . Observe que se , então , e esse termo é um mapa completamente positivo e com preservação de traços. No entanto, se , então e o mapa não é completamente positivo ou preserva o traço. Deixando que , e sejam se e caso contrário, reescrevemos o mapa como:
Se , e a expressão se reduz à mistura padrão do mapa de identidade e conjugação por . Se , , e o mapa é uma diferença em escala do mapa de identidade e conjugação por , com pesos de probabilidade (portanto, "quase-probabilidade"). Observe que essa é uma apresentação um pouco diferente da literatura, mas essa notação nos permite lidar com taxas não negativas e negativas simultaneamente. O geral do canal é o produto .
Consulte o PauliLindbladMap.sample() para o procedimento de amostragem desse mapa.
Representação
Cada operador Pauli individual no gerador é um produto tensorial de operadores Pauli de um único qubit da forma , para . A representação interna de um PauliLindbladMap armazena apenas os operadores de Pauli de um único qubit sem identidade. Isso torna significativamente mais eficiente a representação de geradores como ; para os quais PauliLindbladMap requer uma quantidade de memória linear no número total de qubits.
Internamente, PauliLindbladMap armazena uma matriz de taxas e um QubitSparsePauliList contendo os operadores Pauli esparsos correspondentes. Além disso, PauliLindbladMap é possível calcular o canal global no gamma() método, bem como as probabilidades correspondentes através do probabilities() método.
Indexando
PauliLindbladMap comporta-se como uma sequência Python (a forma padrão, não a expandida collections.abc.Sequence). Os geradores do mapa podem ser indexados por números inteiros e iterados para produzir termos de geradores individuais.
Cada termo gerador aparece como uma instância de uma classe autônoma. Os termos individuais são copiados do mapa base; as alterações feitas neles não afetarão o mapa original do qual foram indexados.
GeneratorTerm
class GeneratorTerm(rate, qubit_sparse_pauli)
Bases: object
Um único termo de um PauliLindbladMap.
Normalmente, eles são criados por meio de indexação ou iteração em um arquivo PauliLindbladMap.
copy
copy()
Obtenha uma cópia deste termo.
indices
Visualização somente de leitura dos índices de cada termo de qubit único sem identidade.
Os índices sempre estarão em ordem ordenada.
num_qubits
O número de qubits em que o termo é definido.
pauli_labels
pauli_labels()
Retorna os rótulos pauli do termo como uma cadeia de caracteres.
Os rótulos pauli corresponderão à ordem de GeneratorTerm.indicesde modo que o i-ésimo caractere da string seja aplicado ao índice do qubit em term.indices[i]. E.g. o termo com o operador X atuando no qubit 0 e Y atuando no qubit 3 terá term.indices == np.array([0, 3]) e term.pauli_labels == "XY".
Retorna
Os termos de bits sem identidade como uma cadeia concatenada.
paulis
Visualização somente de leitura dos termos individuais de um único qubit.
Os únicos valores válidos na matriz são aqueles com um Pauli correspondente.
qubit_sparse_pauli
O termo é qubit_sparse_pauli.
rate
A taxa do termo.
to_pauli_lindblad_map
to_pauli_lindblad_map()
Converta esse termo em um PauliLindbladMap.
Construção
PauliLindbladMap define vários construtores. O construtor padrão tentará delegar a um dos construtores mais específicos, com base no tipo de entrada. Você sempre pode usar os construtores específicos para ter mais controle sobre a construção.
Método | Resumo |
|---|---|
from_list() | Geradores fornecidos como uma lista de tuplas de rótulos de cadeias densas e as taxas associadas. |
from_sparse_list() | Geradores fornecidos como uma lista de tuplas de rótulos de cadeia esparsa, os qubits aos quais se aplicam e suas taxas. |
from_terms() | Soma de instâncias individuais explícitas GeneratorTerm instâncias. |
from_components() | Criado a partir de uma matriz de taxas e uma instância QubitSparsePauliList instância. |
__new__
__new__(data, /, num_qubits=None)
O construtor padrão do PauliLindbladMap.
Isso delega a um dos métodos de construtor de conversão explícitos, com base no tipo do argumento data . Se num_qubits for fornecido e o construtor implícito pelo tipo de data não aceitar um número, o número inteiro fornecido deverá corresponder à entrada.
Parâmetros
- data - O tipo de dados da entrada. Pode ser outro
PauliLindbladMape, nesse caso, a entrada é copiada, ou pode ser uma lista em um formato válido parafrom_list()oufrom_sparse_list(). - num_qubits (int|None) – Número opcional de qubits para o mapa. Para a maioria das entradas de dados, isso pode ser inferido e não precisa ser passado. Isso só é necessário para listas vazias ou para o formato de lista esparsa. Se for fornecido desnecessariamente, deverá corresponder à entrada de dados.
Além dos construtores baseados em conversão, há também métodos auxiliares que constroem formas especiais de mapas.
Método | Resumo |
|---|---|
identity() | O mapa de identidade em um determinado número de qubits. |
Conversões
Um arquivo existente PauliLindbladMap existente pode ser convertido em outros formatos.
Método | Resumo |
|---|---|
to_sparse_list() | Expresse o mapa em um formato de lista esparsa com elementos (paulis, indices, rate). |
Atributos
num_qubits
O número de qubits em que o mapa atua.
Isso não pode ser inferido de nenhuma outra forma ou valor, pois as identidades não são armazenadas explicitamente.
num_terms
O número de termos do gerador no expoente desse mapa.
rates
As taxas do mapa.
Métodos
apply_layout
apply_layout(layout, num_qubits=None)
Aplique um layout de transpilador a esse mapa de Pauli Lindblad.
Isso permite o remapeamento de índices de qubit, por exemplo, se o mapa for definido em termos de rótulos de qubit virtual.
Parâmetros
- layout (TranspileLayout |list[int] | None) – O layout a ser aplicado. A maioria dos usos dessa função deve passar o campo
QuantumCircuit.layoutde um circuito que foi transpilado para hardware. Além disso, você pode passar uma lista de novos índices de qubit. Se for fornecido explicitamente comoNone, nenhum remapeamento será aplicado (mas você ainda poderá usarnum_qubitspara expandir o mapa). - num_qubits (int | None) – O número de qubits para os quais expandir o mapa. Se não for fornecido, a saída terá a mesma largura que a entrada fornecida
TranspileLayoutou a mesma largura da entrada se o endereçolayoutfor fornecido em outro formato.
Retorna
Um novo PauliLindbladMap com o layout fornecido aplicado.
clear
clear()
Limpe todos os termos geradores desse mapa, tornando-o novamente igual ao mapa de identidade.
Isso não altera a capacidade das alocações internas; portanto, operações subsequentes de adição ou subtração resultantes da composição podem não exigir uma realocação.
Exemplos
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IXXXYY", 2.0), ("ZZYZII", -1)])
>>> pauli_lindblad_map.clear()
>>> assert pauli_lindblad_map == PauliLindbladMap.identity(pauli_lindblad_map.py_num_qubits())compose
compose(other)
Compor com outro PauliLindbladMap.
Isso anexa as matrizes internas de self e other e, portanto, resulta em um mapa cujos termos enumerados são os de self seguidos pelos de other.
Parâmetros
other (PauliLindbladMap) – o mapa Pauli Lindblad para compor.
copy
copy()
Obtenha uma cópia desse mapa da Pauli Lindblad.
Exemplos
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IXZXYYZZ", 2.5), ("ZXIXYYZZ", 0.5)])
>>> assert pauli_lindblad_map == pauli_lindblad_map.copy()
>>> assert pauli_lindblad_map is not pauli_lindblad_map.copy()drop_paulis
drop_paulis(indices)
Retire Paulis deste mapa de Pauli Lindblad.
Elimine todos os Pauli nos índices fornecidos, substituindo-os efetivamente por uma identidade.
O mapa resultante pode conter duplicatas, que podem ser removidas usando o método PauliLindbladMap.simplify() método.
Parâmetros
indices (Sequence[int]) – Os índices para os quais a Paulis deve ser descartada.
Retorna
Um novo mapa de Pauli Lindblad em que todos os Pauli nos índices fornecidos foram eliminados.
Exemplos
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_paulis([1, 2, 4])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("IXIII", 2.0), ("IIIIZ", 0.5), ("IIIIY", -0.25)])drop_qubits
drop_qubits(indices)
Retire os qubits desse mapa de Pauli Lindblad, realizando efetivamente uma operação de rastreamento.
O mapa resultante pode conter duplicatas, que podem ser removidas usando o método PauliLindbladMap.simplify() método.
Parâmetros
indices (Sequence[int]) – Os índices dos qubits a serem rastreados.
Retorna
Um novo mapa de Pauli Lindblad em que todos os Pauli nos índices fornecidos foram rastreados.
Exemplos
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.drop_qubits([1, 2, 4])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("XI", 2.0), ("IZ", 0.5), ("IY", -0.25)])from_components
static from_components(rates, qubit_sparse_pauli_list)
from_list
static from_list(iter, /, *, num_qubits=None)
Construa um mapa de Pauli Lindblad a partir de uma lista de rótulos e taxas de geradores densos.
Isso é análogo a SparsePauliOp.from_list(). Nesse formulário denso, você deve fornecer todas as identidades explicitamente em cada rótulo.
O rótulo deve ser uma sequência do alfabeto 'IXYZ'. O rótulo é interpretado de forma análoga a uma cadeia de bits. Em outras palavras, a letra mais à direita está associada ao qubit 0, e assim por diante. Isso é o mesmo que os rótulos de Pauli e SparsePauliOp.
Parâmetros
- iter (list[tuple[str, float]]) – Pares de rótulos e suas taxas associadas na soma do gerador.
- num_qubits (int | None) – Não é necessário especificar isso se você tiver certeza de que
iternão é uma sequência vazia, pois isso pode ser inferido a partir dos comprimentos dos rótulos. Seiterpuder estar vazio, você deverá especificar esse argumento para não ambiguidade em quantos qubits o mapa atua. Se isso for fornecido eiternão estiver vazio, o valor deverá corresponder aos comprimentos do rótulo.
Exemplos
Construa um mapa de Pauli Lindblad a partir de uma lista de rótulos:
>>> PauliLindbladMap.from_list([
... ("IIIXX", 1.0),
... ("IIYYI", 1.0),
... ("IXXII", -0.5),
... ("ZZIII", -0.25),
... ])
<PauliLindbladMap with 4 terms on 5 qubits:
(1)L(X_1 X_0) + (1)L(Y_2 Y_1) + (-0.5)L(X_3 X_2) + (-0.25)L(Z_4 Z_3)>Use num_qubits para eliminar a ambiguidade de entradas potencialmente vazias:
>>> PauliLindbladMap.from_list([], num_qubits=10)
<PauliLindbladMap with 0 terms on 10 qubits: 0.0>Esse método é equivalente a chamadas para from_sparse_list() com o campo explícito qubit-arguments definido como números inteiros decrescentes:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> rates = [1.5, 2.0, -0.5]
>>> from_list = PauliLindbladMap.from_list(list(zip(labels, rates)))
>>> from_sparse_list = PauliLindbladMap.from_sparse_list([
... (label, (3, 2, 1, 0), rate)
... for label, rate in zip(labels, rates)
... ])
>>> assert from_list == from_sparse_listConstrua o mapa a partir de uma lista de rótulos sem identidades explícitas, mas com os qubits aos quais cada termo gerador de qubit único se aplica listado explicitamente.
from_sparse_list
static from_sparse_list(iter, /, num_qubits)
Construa um mapa de Pauli Lindblad a partir de uma lista de rótulos, os qubits aos quais cada item se aplica e a taxa de todo o termo.
Isso é análogo a SparsePauliOp.from_sparse_list().
Os campos "labels" (rótulos) e "indices" (índices) das triplas são associados por meio de um zíper. Por exemplo, isso significa que uma chamada para from_list() pode ser convertida para a forma usada por esse método, definindo o campo "indices" de cada tripla como (num_qubits-1, ..., 1, 0).
Parâmetros
- iter (list[tuple[str, Sequence[int], float]]) – triplas de rótulos, os qubits aos quais cada termo de qubit único se aplica e a taxa de todo o termo.
- num_qubits (int) – o número de qubits em que o mapa atua.
Exemplos
Construa um mapa simples:
>>> PauliLindbladMap.from_sparse_list(
... [("ZX", (1, 4), 1.0), ("YY", (0, 3), 2)],
... num_qubits=5,
... )
<PauliLindbladMap with 2 terms on 5 qubits: (1)L(X_4 Z_1) + (2)L(Y_3 Y_0)>Esse método pode replicar o comportamento de from_list()se o campo qubit-arguments da tripla for definido como números inteiros decrescentes:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> rates = [1.5, 2.0, -0.5]
>>> from_list = PauliLindbladMap.from_list(list(zip(labels, rates)))
>>> from_sparse_list = PauliLindbladMap.from_sparse_list([
... (label, (3, 2, 1, 0), rate)
... for label, rate in zip(labels, rates)
... ])
>>> assert from_list == from_sparse_listO inverso desse método.
from_terms
static from_terms(obj, /, num_qubits=None)
Construa um PauliLindbladMap a partir de termos individuais.
Todos os termos devem ter o mesmo número de qubits. Se fornecido, o argumento num_qubits deve corresponder aos termos.
Nenhuma simplificação é feita como parte da criação do mapa.
Parâmetros
- obj (Iterable[Term]) – Iterável de termos individuais para criar o gerador de mapas.
- num_qubits (int | None) – O número de qubits em que o mapa deve atuar. Isso geralmente é inferido a partir da entrada, mas pode ser explicitamente fornecido para lidar com o caso de um iterável vazio.
Retorna
O mapa correspondente.
gamma
gamma()
Calcule o endereço para o mapa.
generators
generators()
Obtenha os geradores do mapa.
Este é um alias para get_qubit_sparse_pauli_list_copy(), oferecendo um nome mais prático que se alinha às convenções de nomenclatura utilizadas no Aer e no Runtime para classes semelhantes.
Retorna
Uma cópia dos termos do gerador do mapa.
Tipo de retorno
get_qubit_sparse_pauli_list_copy
get_qubit_sparse_pauli_list_copy()
Obtenha uma cópia da lista pauli esparsa de qubits do mapa.
identity
static identity(num_qubits)
Obtém o mapa de identidade no número de qubits fornecido.
O mapa de identidade não contém termos geradores e é o elemento de identidade para a composição de duas instâncias PauliLindbladMap qualquer coisa composta com o mapa de identidade é igual a ele mesmo.
Exemplos
Obtenha o mapa de identidade em 100 qubits:
>>> PauliLindbladMap.identity(100)
<PauliLindbladMap with 0 terms on 100 qubits: 0.0>inverse
inverse()
Retorna um novo PauliLindbladMap que é o inverso matemático de self.
keep_paulis
keep_paulis(indices)
Mantenha todos os Pauli nos índices fornecidos e elimine todos os outros.
Isso é equivalente a usar PauliLindbladMap.drop_paulis() no conjunto complementar de índices.
Parâmetros
indices (Sequence[int]) – Os índices para os quais o Paulis deve ser mantido.
Retorna
Um novo mapa de Pauli Lindblad em que todos os Pauli nos índices fornecidos foram mantidos e todos os outros Paulis foram descartados.
Exemplos
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_paulis([0, 3])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("IXIII", 2.0), ("IIIIZ", 0.5), ("IIIIY", -0.25)])keep_qubits
keep_qubits(indices)
Mantenha cada qubit nos índices fornecidos e rastreie todos os outros qubits.
Isso é equivalente a usar PauliLindbladMap.drop_qubits() no conjunto complementar de índices.
Parâmetros
indices (Sequence[int]) – Os índices para os quais os qubits devem ser mantidos.
Retorna
Um novo mapa de Pauli Lindblad em que cada qubit nos índices fornecidos foi mantido e todos os outros qubits foram rastreados.
Exemplos
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_qubits([0, 3])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("XI", 2.0), ("IZ", 0.5), ("IY", -0.25)])parity_sample
parity_sample(num_samples, seed=None, scale=None, local_scale=None)
Amostra de sinal e pares de operadores Pauli do mapa.
Cada sinal é representado por um booleano, com True representando -1e False representando +1.
Dada a representação de quase-probabilidade fornecida na documentação em nível de classe, cada amostra é extraída por meio do seguinte processo:
- Inicialize o sinal booleano e uma instância
QubitSparsePaulipara o operador de identidade. - Iterar por cada Pauli no mapa. Usando a pseudoprobabilidade associada a cada operador, escolha aleatoriamente entre aplicar ou não o operador.
- Se o operador for aplicado, atualize o :class`QubitSparsePauli` multiplicando-o pelo Pauli. Se a taxa associada ao Pauli for negativa, inverta o sinal booleano.
Os resultados são retornados como uma matriz 1d de booleanos, e o qubit esparso Paulis amostrado correspondente na forma de um QubitSparsePauliList.
Os argumentos scale e local_scale podem ser usados para alterar as taxas subjacentes utilizadas no processo de amostragem sem modificar a instância atual ou exigir a criação de uma nova. O scale argumento dimensiona todas as taxas por um flutuante fixo e local_scale dimensiona as taxas termo a termo.
Parâmetros
- num_samples (int) – Número de amostras a serem extraídas.
- seed (int) – Semente aleatória.
- scale (float) – Escala a aplicar a todas as taxas.
- local_scale (list[float]) – Escala local a aplicar em cada semestre.
Retorna
A matriz booleana de sinais e a lista de paulis esparsos de qubit.
Tipo de retorno
sinais, qubit_sparse_pauli_list
pauli_fidelity
pauli_fidelity(qubit_sparse_pauli)
Calcule a fidelidade Pauli desse mapa para um qubit Pauli esparso.
Para um Pauli , a fidelidade com relação ao mapa de Pauli Lindblad é o número real para o qual . I.e. cada Pauli é um vetor próprio do mapa linear , e a fidelidade é o valor próprio correspondente. Para um mapa Pauli Lindblad com conjunto gerador e função de taxa , a fidelidade pauli é matematicamente
em que é se e forem comuns, e se forem incomuns.
Args: qubit_sparse_pauli ( QubitSparsePauli ): o qubit sparse Pauli para calcular o Pauli
fidelidade de.
probabilities
probabilities()
Calcule as probabilidades para o mapa. Estas podem ser interpretadas como as probabilidades de cada gerador não ser aplicado e são definidas como independentes do sinal de cada taxa de Lindblad.
sample
sample(num_samples, seed=None)
Para PauliLindbladMap casos com taxas puramente não negativas, amostre os operadores de Pauli a partir do mapa. Se o mapa tiver taxas negativas, use PauliLindbladMap.parity_sample().
Dada a representação de quase-probabilidade fornecida na documentação em nível de classe, cada amostra é extraída por meio do seguinte processo:
- Inicialize uma instância de :class`~.QubitSparsePauli` com o operador de identidade.
- Iterar por cada Pauli no mapa. Usando a pseudoprobabilidade associada a cada operador, escolha aleatoriamente entre aplicar ou não o operador.
- Se o operador for aplicado, atualize o :class`QubitSparsePauli` multiplicando-o pelo Pauli.
Os Paulis esparsos de qubit amostrados são retornados na forma de um QubitSparsePauliList.
Parâmetros
- num_samples (int) – Número de amostras a serem extraídas.
- seed (int) – Semente aleatória. Padroniza para
None.
Retorna
A lista de qubit sparse paulis.
Tipo de retorno
qubit_sparse_pauli_list
Aumentos
ValueError - Se alguma das taxas no mapa for negativa.
scale_rates
scale_rates(scale_factor)
Retorna um novo PauliLindbladMap com taxas dimensionadas pelo fator scale_factor.
Parâmetros
scale_factor (float) – o coeficiente de escala.
signed_sample
signed_sample(num_samples, seed=None)
Exemplos de pares de sinais e operadores de Pauli do mapa. Observe que a convenção de sinal booleano neste método não é padrão. O método preferido para esse tipo de amostragem é PauliLindbladMap.parity_sample(), que também é mais rico em recursos.
Cada sinal é representado por um booleano, com True representando +1, e False representando -1.
Dada a representação de quase-probabilidade fornecida na documentação em nível de classe, cada amostra é extraída por meio do seguinte processo:
- Inicialize o sinal booleano e uma instância
QubitSparsePaulipara o operador de identidade. - Iterar por cada Pauli no mapa. Usando a pseudoprobabilidade associada a cada operador, escolha aleatoriamente entre aplicar ou não o operador.
- Se o operador for aplicado, atualize o :class`QubitSparsePauli` multiplicando-o pelo Pauli. Se a taxa associada ao Pauli for negativa, inverta o sinal booleano.
Os resultados são retornados como uma matriz 1d de booleanos, e o qubit esparso Paulis amostrado correspondente na forma de um QubitSparsePauliList.
Parâmetros
Retorna
A matriz booleana de sinais e a lista de paulis esparsos de qubit.
Tipo de retorno
sinais, qubit_sparse_pauli_list
simplify
simplify(tol=1e-08)
Some todos os termos semelhantes no gerador, removendo-os se a taxa resultante tiver um valor absoluto dentro da tolerância de zero. Isso também elimina termos cujo operador de Pauli é proporcional à identidade, já que o gerador correspondente é, na verdade, o mapa nulo.
Como efeito colateral, isso classifica os geradores em uma ordem canônica fixa.
Ao utilizar isso para comparações de igualdade, observe que o arredondamento de números de ponto flutuante e a não associatividade da adição de números de ponto flutuante podem fazer com que coeficientes diferentes de zero dos termos somados sejam considerados desiguais. Para comparar duas grandezas observáveis dentro de um limite de tolerância, o método mais seguro é comparar a diferença canonicizada entre as duas grandezas observáveis com o valor zero.
Parâmetros
tol (float) – depois de somar termos semelhantes, todas as taxas cujo valor absoluto for menor do que a tolerância absoluta fornecida serão suprimidas da saída.
Exemplos
Usando simplify() para comparar dois operadores que representam o mesmo mapa, mas que seriam comparados de forma desigual devido aos testes estruturais por padrão:
>>> base = PauliLindbladMap.from_sparse_list([
... ("XZ", (2, 1), 1e-10), # value too small
... ("XX", (3, 1), 2),
... ("XX", (3, 1), 2), # can be combined with the above
... ("ZZ", (3, 1), 0.5), # out of order compared to `expected`
... ], num_qubits=5)
>>> expected = PauliLindbladMap.from_list([("IZIZI", 0.5), ("IXIXI", 4)])
>>> assert base != expected # non-canonical comparison
>>> assert base.simplify() == expected.simplify()Observe que, no exemplo acima, os coeficientes são escolhidos de forma que todos os cálculos de ponto flutuante sejam exatos e não haja problemas intermediários de arredondamento ou associatividade. Se não for possível garantir que esse seja o caso, a forma mais segura é:
>>> left = PauliLindbladMap.from_list([("XYZ", 1.0/3.0)] * 3) # sums to 1.0
>>> right = PauliLindbladMap.from_list([("XYZ", 1.0/7.0)] * 7) # doesn't sum to 1.0
>>> assert left.simplify() != right.simplify()
>>> assert left.compose(right.inverse()).simplify() == PauliLindbladMap.identity(left.num_qubits)to_sparse_list
to_sparse_list()
Expresse o mapa em termos de um formato de lista esparsa.
Isso pode ser visto como uma contraoperação de PauliLindbladMap.from_sparse_list()no entanto, não é garantido que a ordem dos termos seja a mesma depois de uma viagem de ida e volta para uma lista esparsa.
Exemplos
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IIXIZ", 2), ("IIZIX", 3)])
>>> reconstructed = PauliLindbladMap.from_sparse_list(pauli_lindblad_map.to_sparse_list(), pauli_lindblad_map.num_qubits)O construtor que pode interpretar essas listas.