¿Qué funciones de OpenQASM admite Braket? - Amazon Braket

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

¿Qué funciones de OpenQASM admite Braket?

La siguiente sección enumera los tipos de datos, las sentencias y las instrucciones de pragma de OpenQASM 3.0 compatibles con Braket.

Tipos de datos de OpenQASM compatibles

AmazonBraket admite los siguientes tipos de datos de OpenQASM.

  • Los números enteros no negativos se utilizan para los índices de cúbits (virtuales y físicos):

    • cnot q[0], q[1];

    • h $0;

  • Se pueden utilizar números o constantes de coma flotante para los ángulos de rotación de la compuerta:

    • rx(-0.314) $0;

    • rx(pi/4) $0;

nota

pi es una constante integrada en OpenQASM y no se puede utilizar como nombre de parámetro.

  • Se permiten matrices de números complejos (con laim notación OpenQASM para la parte imaginaria) en los pragmas de tipos de resultados para definir los observables hermitianos generales y en los pragmas unitarios:

    • #pragma braket unitary [[0, -1im], [1im, 0]] q[0]

    • #pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]

Instrucciones de OpenQASM compatibles

AmazonBraket admite las siguientes sentencias de OpenQASM.

  • Header: OPENQASM 3;

  • Declaraciones de bits clásicas:

    • bit b1;(equivalentemente,creg b1;)

    • bit[10] b2;(equivalentemente,creg b2[10];)

  • Declaraciones de Qubit:

    • qubit b1;(equivalentemente,qreg b1;)

    • qubit[10] b2;(equivalentemente,qreg b2[10];)

  • Indexación dentro de matrices:q[0]

  • Entrada:input float alpha;

  • especificación del físicoqubits:$0

  • Puertas y operaciones compatibles en un dispositivo:

    • h $0;

    • iswap q[0], q[1];

nota

Las puertas compatibles con un dispositivo se encuentran en las propiedades del dispositivo para las acciones de OpenQASM; no se necesitan definiciones de puertas para usar estas puertas.

  • Declaraciones literales en caja. Actualmente, no admitimos la notación de la duración de las casillas. Se requieren puertas nativas y físicas enqubits los recuadros literales.

#pragma braket verbatim box{ rx(0.314) $0; }
  • Medición y asignación de medidas en un registroqubits o en unqubit registro completo.

    • measure $0;

    • measure q;

    • measure q[0];

    • b = measure q;

    • measure q → b;

nota

pi es una constante integrada en OpenQASM y no se puede utilizar como nombre de parámetro.

Rompe los pragmas de OpenQASM

AmazonBraket admite las siguientes instrucciones pragmáticas de OpenQASM.

  • Pragmas de ruido

    • #pragma braket noise bit_flip(0.2) q[0]

    • #pragma braket noise phase_flip(0.1) q[0]

    • #pragma braket noise pauli_channel

  • Pragmas literales

    • #pragma braket verbatim

  • Pragmas de tipos de resultados

    • Tipos de resultados invariantes básicos:

      • Vector de estado:#pragma braket result state_vector

      • Matriz de densidad:#pragma braket result density_matrix

    • Pragmas de cálculo de gradientes:

      • Gradiente adjunto:#pragma braket result adjoint_gradient expectation(2.2 * x[0] @ x[1]) all

    • Tipos de resultados básicos Z:

      • Amplitud:#pragma braket result amplitude "01"

      • Probabilidad:#pragma braket result probability q[0], q[1]

    • Tipos de resultados rotados básicos

      • Expectativa:#pragma braket result expectation x(q[0]) @ y([q1])

      • Varianza:#pragma braket result variance hermitian([[0, -1im], [1im, 0]]) $0

      • Muestra:#pragma braket result sample h($1)

nota

OpenQASM 3.0 es compatible con versiones anteriores de OpenQASM 2.0, por lo que los programas escritos con 2.0 pueden ejecutarse en Braket. Sin embargo, las funciones de OpenQASM 3.0 compatibles con Braket tienen algunas diferencias sintácticas menores, comoqreg vscreg yqubit vsbit. También hay diferencias en la sintaxis de las mediciones, y es necesario admitirlas con la sintaxis correcta.

Soporte de funciones avanzadas para OpenQASM en el simulador local

LocalSimulatorAdmite funciones avanzadas de OpenQASM que no se ofrecen como parte de las QPU de Braket ni de los simuladores bajo demanda. La siguiente lista de funciones solo se admite enLocalSimulator:

  • Modificadores de puertas

  • Puertas integradas de OpenQASM

  • Variables clásicas

  • Operaciones clásicas

  • Puertas personalizadas

  • Control clásico

  • archivos QASM

  • Subrutinas

Para ver ejemplos de cada función avanzada, consulte este cuaderno de ejemplo. Para ver la especificación completa de OpenQASM, consulte el sitio web de OpenQASM.

Operaciones y gramática compatibles con OpenPulse

Tipos OpenPulse de datos compatibles

Bloques de llamadas:

cal { ... }

Bloques de calcomanías:

// 1 qubit defcal x $0 { ... } // 1 qubit w. input parameters as constants defcal my_rx(pi) $0 { ... } // 1 qubit w. input parameters as free parameters defcal my_rz(angle theta) $0 { ... } // 2 qubit (above gate args are also valid) defcal cz $1, $0 { ... }

Marcos:

frame my_frame = newframe(port_0, 4.5e9, 0.0);

Formas de onda:

// prebuilt waveform my_waveform_1 = constant(1e-6, 1.0); //arbitrary waveform my_waveform_2 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};

Ejemplo de calibración de compuerta personalizada:

cal { waveform wf1 = constant(1e-6, 0.25); } defcal my_x $0 { play(wf1, q0_rf_frame); } defcal my_cz $1, $0 { barrier q0_q1_cz_frame, q0_rf_frame; play(q0_q1_cz_frame, wf1); delay[300ns] q0_rf_frame shift_phase(q0_rf_frame, 4.366186381749424); delay[300ns] q0_rf_frame; shift_phase(q0_rf_frame.phase, 5.916747563126659); barrier q0_q1_cz_frame, q0_rf_frame; shift_phase(q0_q1_cz_frame, 2.183093190874712); } bit[2] ro; my_x $0; my_cz $1,$0; c[0] = measure $0;

Ejemplo de pulso arbitrario:

bit[2] ro; cal { waveform wf1 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1}; barrier q0_drive, q0_q1_cross_resonance; play(q0_q1_cross_resonance, wf1); delay[300ns] q0_drive; shift_phase(q0_drive, 4.366186381749424); delay[300dt] q0_drive; barrier q0_drive, q0_q1_cross_resonance; play(q0_q1_cross_resonance, wf1); ro[0] = capture_v0(r0_measure); ro[1] = capture_v0(r1_measure); }