Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Microsoft Quantum Development Kit (QDK) inclui um conjunto de simuladores quânticos que modelam como o seu programa corre num computador quântico. Os programas que executas num computador quântico incluem sempre algum tipo e grau de ruído. O QDKPython pacote permite-lhe construir modelos de ruído personalizados para usar nas suas simulações através da NoiseConfig API.
Para instruções sobre como instalar e usar os QDK simuladores, veja Como instalar e executar os QDK simuladores quânticos.
Tipos de ruído
Cada operação ou instrução num programa quântico pode introduzir ruído. A tabela seguinte lista todas as operações e instruções para as quais pode definir o ruído.
| Fonte de ruído | Parâmetro do modelo de ruído | Descrição da fonte |
|---|---|---|
| porta $X$ | x |
Porta de Pauli de qubit único, inversão do bit |
| porta $Y$ | y |
Porta de Pauli de qubit único, inversão de bit e inversão de fase |
| porta $Z$ | z |
Porta de Pauli de qubit único, inversão de fase |
| porta $H$ | h |
Porta de Hadamard de qubit único cria um estado de superposição igual |
| porta $S$ | s |
Porta de um qubit, inversão de fase de meio pi |
| porta $S^\dagger$ | s_adj |
Porta de qubit único, adjunto de $S$ |
| porta $T$ | t |
Porta lógica de qubit único, rebordo de fase π/4 |
| porta $T^\dagger$ | t_adj |
Porta de qubit único, adjunto de $T$ |
| $S_X$ porta | sx |
Porta de qubit único, inversão de meio bit |
| porta $S_X^\dagger$ | sx_adj |
Porta de qubit único, adjunta de $S_X$ |
| $R_X$ porta | rx |
Porta de qubit único, rotação de fase geral em torno do eixo $x$ |
| porta $R_Y$ | ry |
Porta de qubit único, rotação geral de fase em torno do eixo $y$ |
| Porta $R_Z$ | rz |
Porta de um único qubit, rotação geral de fase em torno do eixo $z$ |
| porta $CX$ | cx |
Porta de dois qubits, porta controlada de $X$ |
| porta $CY$ | cy |
Porta de dois qubits, porta controlada por $Y$ |
| Portão $CZ$ | cz |
Porta de dois qubits, porta controlada de $Z$ |
| porta $R_{XX}$ | rxx |
Porta de dois qubits, análoga a $R_X$ |
| porta $R_{YY}$ | ryy |
Porta de dois qubits, análoga a $R_Y$ |
| porta $R_{ZZ}$ | rzz |
Porta de dois qubits, análoga a $R_Z$ |
| porta $SWAP$ | swap |
Porta de dois qubits, troca os estados dos qubits |
| porta $CCX$ | ccx |
Porta de três qubits, porta controlada de dois qubits $X$ |
| Movimento dos Qubits | mov |
Movimento de qubits entre zonas do dispositivo (para simulação de dispositivos com átomos neutros) |
| Medição de Qubit | mz |
Medição de qubit único na base de Pauli-$Z$ |
| Medição e reset do qubit | mresetz |
Medição de um único qubit e reset para o estado 0 |
Com NoiseConfig, pode-se aplicar quatro tipos diferentes de ruído às operações anteriores com probabilidades específicas. A tabela seguinte lista os parâmetros do tipo de ruído que pode definir com NoiseConfig, incluindo um parâmetro para ausência de ruído.
| Tipo de ruído | Parâmetro do modelo de ruído | Descrição do ruído | Utilização de exemplo | Descrição de exemplo |
|---|---|---|---|---|
| ruído de Pauli $X$ | x |
Inversão de bits | noise.z.x = 0.03 |
A inversão de bits ocorre em 3% de operações de $Z$ |
| Ruído de Pauli $Y$ | y |
Inversão de bits e inversão de fase | noise.sx.y = 0.01 |
A inversão de bits e a inversão de fase ocorrem em 1% das operações de $S_X$ |
| Ruído de Pauli $Z$ | z |
Inversão de fase | noise.h.z = 0.02 |
A inversão de fase ocorre em 2% das operações $H$ |
| Sem ruído | i |
Operação de identidade, sem efeito | noise.cz.ix = 0.02 |
A inversão de bit apenas no qubit alvo ocorre em 2% das operações de $CZ$ |
| Perda de qubits | l |
O Qubit perdeu-se do dispositivo | noise.mov.l = 0.03 |
O qubit perde-se em 3% de movimentos entre zonas de dispositivo num computador quântico de átomos neutros |
O ruído ocorre após a operação de origem, não em vez da operação de origem. Por exemplo, noise.z.x significa que o programa aplica a porta $Z$ pretendida ao qubit, e depois aplica uma porta $X$ não intencional ao qubit. Como o ruído aplica-se depois da fonte, podes configurar ruído que tenha o mesmo efeito que a fonte. Por exemplo, noise.x.x aplica uma inversão de bit não intencional após a inversão de bit prevista.
Note
As APIs de simulação de dispositivos de átomos neutros suportam ruído proveniente de um número limitado de fontes. Para mais informações, veja Como construir modelos de ruído para simulações de dispositivos de átomos neutros no QDK.
Construir um modelo de ruído
Para construir um modelo de ruído para uma simulação e ver os efeitos desse ruído nos resultados do seu programa quântico, siga estes passos.
No VS Code, abra o menu Exibir e escolha Paleta de comandos.
Inserir Criar: Novo Jupyter Notebook. Um ficheiro vazio Jupyter Notebook abre-se num novo separador.
Na primeira célula do caderno, importa os objetos necessários Python .
from qdk import init, TargetProfile from qdk.openqasm import compile from qdk.simulation import NoiseConfig, run_qir from qdk.widgets import HistogramNuma célula nova, define o perfil de alvo QIR do dispositivo e compila o teu circuito OpenQASM para QIR.
init(target_profile=TargetProfile.Base) qasm_src = """ include "stdgates.inc"; qubit[2] qs; bit[2] r; h qs[0]; cx qs[0], qs[1]; r = measure qs; """ qir = compile(qasm_src)Cria um
NoiseConfigobjeto e constrói o teu modelo de ruído.noise = NoiseConfig() noise.h.x = 0.01 noise.cx.zi = 0.02Este código produz o seguinte modelo de ruído, onde a taxa de ruído é a probabilidade de a fonte causar o tipo correspondente de ruído.
Fonte de ruído Tipo de ruído Taxa de ruído porta $H$ Inversão de bits 1% porta $CX$ Inversão de fase no qubit de controlo 2% Executa o simulador com o modelo de ruído e visualiza um histograma dos resultados das medições. Por exemplo, execute o seguinte código para simular 1.000 disparos do seu programa no simulador Clifford.
results = run_qir(qir, shots=1000, noise=noise, type="clifford") Histogram(results, labels="kets")Para comparar os resultados ruidosos com uma simulação sem ruído, execute novamente a simulação sem modelo de ruído.
results = run_qir(qir, shots=1000, type="clifford") Histogram(results, labels="kets")
Defina vários tipos de ruído na mesma fonte
Podes modelar diferentes tipos de ruído na mesma fonte, com probabilidades diferentes para cada tipo de ruído. Por exemplo, o código seguinte define uma probabilidade de 1% de ocorrer uma inversão de bit e uma probabilidade de 3% de ocorrer uma inversão de fase após uma porta de Hadamard.
noise.h.x = 0.01
noise.h.z = 0.03
Quando configura vários tipos de ruído para a mesma operação, apenas um tipo de ruído pode aplicar-se a cada operação do seu programa. Por exemplo, cada porta de Hadamard pode ter ruído de $X$ ou ruído de $Z$, mas não ambos.
Funções do modelo de ruído
Em vez de parâmetros do modelo de ruído, pode usar o seguinte conjunto de funções de ruído para construir o seu modelo de ruído.
Configurar ruído de Pauli
Para incluir ruído de Pauli no seu modelo, chame a função set_pauli_noise numa operação de porta lógica ou movimento.
Para operações com um único qubit, passa uma cadeia de Pauli de um carácter e uma taxa de ruído. Por exemplo, o código seguinte define em 1% a probabilidade de ocorrer uma inversão de bit durante o movimento do qubit.
# Equivalent to: noise.mov.x = 0.01
noise.mov.set_pauli_noise('X', 0.01)
Para operações de dois qubits, forneça uma sequência de Pauli de dois caracteres e uma taxa de ruído. O primeiro carácter da cadeia de Pauli corresponde ao ruído no qubit de controlo e o segundo carácter corresponde ao ruído no qubit alvo. Por exemplo, o código seguinte define inversões de fase correlacionadas depois de 1% das operações $CX$.
# Equivalent to: noise.cx.zz = 0.01
noise.cx.set_pauli_noise('ZZ', 0.01)
Definir ruído de despolarização
A set_depolarizing função define taxas de ruído iguais, mas não correlacionadas, para os três tipos de ruído de Pauli. Por exemplo, o código seguinte define uma probabilidade de 3% de que o ruído de Pauli ocorra após uma operação de $H$, distribuída de forma uniforme como uma probabilidade de 1% para cada um dos três tipos de ruído de Pauli.
# Equivalent to:
# noise.h.x = 0.01
# noise.h.y = 0.01
# noise.h.z = 0.01
noise.h.set_depolarizing(0.03)
Definir ruído de inversão de bits
Para definir a taxa de ruído para inversões de bits, use a função set_bitflip num gate ou numa operação de movimento. Por exemplo, o código seguinte estabelece uma probabilidade de 1% de ocorrer uma inversão de fase após uma operação $R_Z$.
# Equivalent to: noise.rz.x = 0.01
noise.rz.set_bitflip(0.01)
Definir ruído de mudança de fase
Para definir a taxa de ruído para inversões de fase numa operação, use a set_phaseflip função numa operação de gate ou movimento. Por exemplo, o código seguinte estabelece uma probabilidade de 1% de ocorrer uma inversão de fase após uma operação $R_Y$.
# Equivalent to: noise.ry.z = 0.01
noise.ry.set_phaseflip(0.01)