Como criar 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 seu programa é executado em um computador quântico. Os programas executados em um computador quântico sempre incluem algum tipo e grau de ruído. O QDKPython pacote permite que você crie modelos de ruído personalizados para usar em suas simulações por meio da NoiseConfig API.

Para obter instruções sobre como instalar e usar os QDK simuladores, consulte Como instalar e executar os QDK simuladores quânticos.

Tipos de ruído

Cada operação ou instrução em um programa quântico pode introduzir ruído. A tabela a seguir lista todas as operações e instruções para as quais você pode definir ruído.

Fonte de ruído Parâmetro do modelo de ruído Descrição da origem
porta $X$ x Porta Pauli de qubit único, inversão de bit
Porta $Y$ y Porta Pauli de qubit único, inversão de bit e inversão de fase
porta $Z$ z Portão Pauli de qubit único, inversão de fase
porta $H$ h Portão hadamard de qubit único, cria estado de superposição igual
porta $S$ s Porta de um único qubit, inversão de fase de meio pi
Porta $S^\dagger$ s_adj Porta de um único qubit, adjunta da porta $S$
porta $T$ t Porta de um único qubit, inversão de fase de um quarto de pi
Porta $T^\dagger$ t_adj Porta de um único qubit, adjunta da porta $T$
porta $S_X$ sx Porta de um único qubit, inversão parcial de bit
Porta $S_X^\dagger$ sx_adj Portão de qubit único, adjacente a $S_X$
porta $R_X$ rx Porta de qubit único, rotação de fase geral sobre o eixo $x$
porta $R_Y$ ry Porta de qubit único, rotação de fase geral sobre o eixo $y$
Porta $R_Z$ rz Porta de qubit único, rotação de fase geral sobre o eixo $z$
porta $CX$ cx porta de dois qubits, porta controlada-$X$
porta $CY$ cy Porta de dois qubits, porta controlada-$Y$
porta $CZ$ cz Porta de dois qubits, porta controlada-$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 $X$ controlada de dois qubits
Movimento do qubit mov Movimentação de qubit entre zonas do dispositivo (para simulação de dispositivos de átomos neutros)
Medição do qubit mz Medida de qubit único na base pauli-$Z$
Medição e reinicialização de qubit mresetz Medição de um único qubit e redefinição para o estado 0

Com NoiseConfig, você pode aplicar quatro tipos diferentes de ruído às operações anteriores com probabilidades específicas. A tabela a seguir lista os parâmetros de tipo de ruído com NoiseConfigos quais você pode definir, incluindo um parâmetro sem 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 $X$ de Pauli x Inversão de bit noise.z.x = 0.03 A inversão de bit ocorre em 3% das operações de $Z$
Ruído $Y$ de Pauli y Inversão de bit e inversão de fase noise.sx.y = 0.01 A inversão de bits e a inversão de fase ocorrem em 1% de operações $S_X$
Ruído $Z$ de Pauli 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 ocorre somente no qubit de destino em 2% das operações $CZ$.
Perda de qubit l O qubit foi perdido do dispositivo noise.mov.l = 0.03 Um qubit se perde em 3% dos deslocamentos entre zonas do dispositivo em um computador quântico de átomos neutros

O ruído ocorre após a operação de origem, e não substitui a operação de origem. Por exemplo, noise.z.x significa que o programa aplica o portão $Z$ pretendido ao qubit e aplica uma porta $X$ não intencional ao qubit. Como o ruído se aplica após a origem, você pode configurar o ruído que tem o mesmo efeito que a origem. Por exemplo, o noise.x.x aplica uma inversão de bit não intencional após a inversão de bit intencional.

Note

As APIs de simulação de dispositivos de átomos neutros oferecem suporte a ruído proveniente de um número limitado de fontes. Para obter mais informações, consulte Como criar modelos de ruído para simulações de dispositivos de átomos neutros no QDK.

Criar um modelo de ruído

Para criar um modelo de ruído para uma simulação e exibir os efeitos desse ruído nos resultados do seu programa quântico, siga estas etapas.

  1. In VS Code, abra o menu Exibir e escolha Paleta de Comandos.

  2. Insira Criar: Novo Jupyter Notebook. Um arquivo Jupyter Notebook vazio é aberto em uma nova guia.

  3. Na primeira célula do notebook, importe 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. Em uma nova célula, defina o perfil de destino qir do dispositivo e compile seu circuito OpenQASM em 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. Crie um NoiseConfig objeto e crie seu modelo de ruído.

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

    Esse código produz o seguinte modelo de ruído, em que a taxa de ruído é a probabilidade de a origem causar o tipo correspondente de ruído.

    Fonte de ruído Tipo de ruído Taxa de ruído
    porta $H$ Inversão de bit 1%
    porta $CX$ Inversão de fase no qubit de controle 2%
  6. Execute o simulador com o modelo de ruído e exiba um histograma dos resultados da medida. Por exemplo, execute o código a seguir para simular 1.000 fotos 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 barulhentos com uma simulação sem ruído, execute a simulação novamente sem nenhum modelo de ruído.

    results = run_qir(qir, shots=1000, type="clifford")
    Histogram(results, labels="kets")
    

Definir vários tipos de ruído na mesma origem

Você pode modelar diferentes tipos de ruído na mesma origem, com probabilidades diferentes para cada tipo de ruído. Por exemplo, o código a seguir 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 Hadamard.

noise.h.x = 0.01
noise.h.z = 0.03

Quando você configura vários tipos de ruído para a mesma operação, apenas um tipo de ruído pode se aplicar a cada operação em seu programa. Por exemplo, cada porta Hadamard pode ter ruído $X$ ou ruído $Z$, mas não ambos.

Funções de modelo de ruído

Em vez de parâmetros de modelo de ruído, você pode usar o seguinte conjunto de funções de ruído para criar seu modelo de ruído.

Definir o ruído de Pauli

Para incluir ruído de Pauli no seu modelo, chame a função set_pauli_noise em uma porta ou operação de movimento.

Para operações de um único qubit, informe uma string de Pauli de um caractere e uma taxa de ruído. Por exemplo, o código a seguir define uma chance de 1% de ocorrer uma inversão de bits durante a movimentação do qubit.

# Equivalent to: noise.mov.x = 0.01
noise.mov.set_pauli_noise('X', 0.01)

Para operações de dois qubits, informe uma string de Pauli de dois caracteres e uma taxa de ruído. O primeiro caractere da cadeia de caracteres Pauli corresponde ao ruído no qubit de controle e o segundo caractere corresponde ao ruído no qubit de destino. Por exemplo, o código a seguir define inversões de fase correlacionadas após 1% das operações $CX$.

# Equivalent to: noise.cx.zz = 0.01
noise.cx.set_pauli_noise('ZZ', 0.01)

Definir o ruído de despolarização

A set_depolarizing função define taxas de ruído iguais, mas não relacionadas, para todos os três tipos de ruído Pauli. Por exemplo, o código a seguir define uma chance de 3% de que o ruído Pauli ocorra após uma operação $H$, distribuída uniformemente como uma chance de 1% para cada um dos três tipos de ruído 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 bit

Para definir a taxa de ruído de inversões de bit, use a função set_bitflip em uma porta ou operação de movimento. Por exemplo, o código a seguir define uma chance de 1% de que uma inversão de fase ocorra após uma operação $R_Z$.

# Equivalent to: noise.rz.x = 0.01
noise.rz.set_bitflip(0.01)

Definir ruído de inversão de fase

Para definir a taxa de ruído de inversões de fase em uma operação, use a função set_phaseflip em uma porta ou operação de movimento. Por exemplo, o código a seguir define uma chance de 1% de que uma inversão de fase ocorra após uma operação $R_Y$.

# Equivalent to: noise.ry.z = 0.01
noise.ry.set_phaseflip(0.01)