Construa 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, consulte Simulações quânticas com o pacote QDKPython.

Tipos de ruído

Cada operação ou instrução num programa quântico pode introduzir ruído. Esta tabela 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 lógica de Pauli qubit único, inversão do bit
porta $Y$ y Porta de qubit único Pauli, inversão de bit e inversão de fase
porta $Z$ z Porta de um único qubit Pauli , inversão de fase
porta $H$ h Porta de qubit único Hadamard, cria um estado de superposição igual
porta $S$ s porta quântica de um qubit, deslocamento de fase de π/2
porta $S^\dagger$ s_adj Porta de qubit único, adjunto de $S$
porta $T$ t Porta de qubit único, deslocamento de fase de um quarto de pi
porta $T^\dagger$ t_adj Porta de qubit único, adjunto de $T$
$S_X$ porta sx porta lógica de qubit único, rotação de meia inversão do 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 Paulibase $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. Esta tabela lista os parâmetros de tipo de ruído que pode definir com NoiseConfig. Inclui também 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
Pauli Ruído $X$ x Inversão de bits noise.z.x = 0.03 A inversão de bits ocorre em 3% de operações de $Z$
Pauli ruído $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$
Pauli ruído $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. 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, defina o perfil alvo do dispositivo QIR e compile o seu OpenQASM circuito em QIR.

    init(target_profile=TargetProfile.Base)
    
    qasm_src = """
    include "stdgates.inc";
    qubit[2] qs;
    bit[2] r;
    
    h qs[0];
    t 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.t.z = 0.01
    noise.cx.zi = 0.02
    

    Este código produz este modelo de ruído, onde 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 $T$ Inversão de fase 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. Este código simula 1.000 execuções no simulador estabilizador. A porta $T$ causa ramificação do estabilizador, e a falha $Z$ configurada é amostrada após a porta $T$.

    results = run_qir(qir, shots=1000, noise=noise, type="stabilizer")
    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="stabilizer")
    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, este código define uma probabilidade de 1% de ocorrer uma inversão de bits e uma probabilidade de 3% de ocorrer uma inversão de fase após uma Hadamard porta.

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 Hadamard porta 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 estas funções de ruído para construir o seu modelo de ruído.

Definir Pauli ruído

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

Para operações de um qubit, passa uma cadeia de um carácter Pauli e uma taxa de ruído. Por exemplo, este código estabelece uma probabilidade de 1% de ocorrer um 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, passa uma cadeia de dois caracteres Pauli e uma taxa de ruído. O primeiro carácter da Pauli cadeia corresponde ao ruído no qubit de controlo e o segundo carácter corresponde ao ruído no qubit alvo. Por exemplo, este código define mudanças de fase correlacionadas após 1% de operações de $CX$.

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

Definir ruído de despolarização

A função set_depolarizing define taxas iguais para os três tipos de ruído Pauli. Por exemplo, este código estabelece uma probabilidade de 3% de ocorrer ruído Pauli após uma operação de $H$, distribuída uniformemente como uma probabilidade de 1% para cada um dos três Pauli tipos de ruído.

# 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, este código define uma hipótese de 1% de ocorrer um bit flip 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, este código 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)