Como construir modelos de ruído para simulações quânticas no QDK

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.

  1. No VS Code, abra o menu Exibir e escolha Paleta de comandos.

  2. Inserir Criar: Novo Jupyter Notebook. Um ficheiro vazio Jupyter Notebook abre-se num novo separador.

  3. 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 Histogram
    
  4. Numa 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)
    
  5. Cria um NoiseConfig objeto e constrói o teu modelo de ruído.

    noise = NoiseConfig()
    
    noise.h.x = 0.01
    noise.cx.zi = 0.02
    

    Este 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%
  6. 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")
    
  7. 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)