Skip to main content
IBM Quantum Platform

Comprobaciones

qiskit_paulice.checks

Funcionalidad para encontrar comprobaciones de Pauli eficaces en el espaciotiempo.

add_pauli_checks

add_pauli_checks(circuit, target_qubits, noise_model, cost='gamma', cost_nshots=10000, method='windowed', ancilla_qubits=None, check_creg_name='checks_c', check_qreg_name='checks_q', seed=None, stabilizers=None)

GitHub

Añade comprobaciones de Pauli en el espaciotiempo a un circuito de Clifford.

Se realizan comprobaciones de las mediciones en los terminales del circuito o, cuando stabilizers se especifica, de los estabilizadores del estado que prepara el circuito:

  • Mediciones (stabilizers=None): circuit termina con las mediciones en base Z. Un cheque es válido si su imagen propagada hacia adelante es diagonal en los qubits medidos, de modo que su bit de síndrome es la paridad de la ancilla de control y los bits de carga útil enumerados en check_support. El contador cost considera que un error es lógico si invierte el estado de un bit medido. Las comprobaciones solo son válidas para esta base de medición.
  • Estabilizadores (stabilizers dados): no circuit contiene medidas. Una comprobación es válida si se propaga hacia atrás hasta un estabilizador del estado de entrada ∣0…0⟩|0\ldots0\rangle, de modo que su síndrome es únicamente el bit auxiliar y sigue siendo válida independientemente de lo que se mida posteriormente. Se considera cost que un error es lógico si invierte uno de los estabilizadores dados del estado preparado; es decir "all" , cualquier error que modifique el estado. Los circuitos devueltos miden únicamente las ancillas de comprobación. Añade tus propias rotaciones de base y medidas de carga útil, y luego vuelve a compilar el CheckedCircuit con dataclasses.replace() para que la postselección vea la disposición final de los registros clásicos.

El algoritmo de selección de comprobaciones busca comprobaciones válidas y de bajo peso en cada qubit objetivo, en el orden en que se especifican en target_qubits , y elige la comprobación que ofrece la mayor cobertura de detección de errores (es decir, la que minimiza el cost valor de ). Una vez que se confirma una comprobación en target_qubits[0], esta se fijará para el resto del algoritmo y comenzará la búsqueda de una comprobación válida en target_qubits[1] . Por este motivo, el orden de target_qubits puede influir en el conjunto de comprobaciones que genera la función.

Esta función genera CheckedCircuit instancias que contienen un número de comprobaciones que oscila entre y 0 una comprobación por cada qubit objetivo. Puede resultar instructivo observar la convergencia de la función de coste a medida que se añaden más comprobaciones, ya que es posible que se observe la convergencia del coste utilizando un número menor de comprobaciones.

Parámetros

  • circuit (QuantumCircuit) – El circuito de Clifford para vestir con patrones de Pauli en el espacio-tiempo. A menos que se stabilizers especifique lo contrario, el circuito debe finalizar con una medición en al menos un qubit, y un qubit medido puede no tener nada más que barreras tras su medición (en caso contrario, se ValueError activa un ). Además, no debe stabilizers contener ninguna medida. El circuito puede definirse en qubits virtuales o físicos. Si el circuito tiene un esquema, el usuario debe proporcionarlo ancilla_qubits.

  • target_qubits (Sequence[int]) – Índices de los qubits circuit que se utilizarán para entrelazar los qubits de comprobación con la carga útil. Cuando circuit tiene una disposición (modo ISA), se trata de índices de qubits físicos, en el mismo espacio de índices que ancilla_qubits.

  • noise_model (NoiseModel) – Un modelo de ruido que describe el efecto del ruido en el dispositivo de destino. Este modelo se utilizará para estimar el efecto de una comprobación concreta durante el proceso de selección de comprobaciones. Aunque es posible generar un modelo de ruido a partir del ruido de Pauli-Lindblad aprendido, a menudo basta con una aproximación más aproximada del ruido generado a partir de los datos de referencia del backend. Los límites de ancilla/objetivo introducidos por la inserción de marcas de control que no figuren en los datos facilitados GateWiseNoise o LayeredGateNoise se deducen automáticamente (tasa mediana por par de Pauli en los datos facilitados); facilítalos explícitamente para anular esta deducción. El ruido del motor al ralentí no está permitido y da lugar a un ValueError.

  • cost (Literal['gamma', 'LER']) –

    Métrica que hay que optimizar. Puede ser "gamma" o "LER" (tasa de error lógico).

    • "gamma": El valor gamma asociado al canal de ruido lógico inverso (es decir, el canal de ruido formado por errores dentro del cono de luz de medición que no pueden detectarse mediante las comprobaciones).
    • "LER": La tasa de error lógico empírico tras la postselección. Realiza simulaciones de Monte Carlo para calcular la proporción de disparos postseleccionados afectados por ruido lógico no detectado.
  • cost_nshots (int) – Número de simulaciones de Monte Carlo utilizadas por las métricas de coste basadas en Monte Carlo (actualmente solo "LER").

  • method (Literal['windowed', 'genetic', 'windowed_genetic']) –

    Selecciona el método de preparación de pedidos ("windowed", "genetic", o "windowed_genetic"). Cada método añadirá comprobaciones de target_qubits forma secuencial. Una vez que se ha aplicado una comprobación a un qubit de destino determinado, esta no se anulará aunque se añadan más comprobaciones. costCada método selecciona las comprobaciones que ofrecen la máxima capacidad de detección de errores (es decir, el valor más bajo).

    • "windowed": Muestrear pequeños subconjuntos de los cables de cada qubit objetivo para encontrar comprobaciones adecuadas
    • "genetic": Desarrollar un conjunto de comprobaciones candidatas a partir del espacio de cables completo de cada qubit objetivo
    • "windowed_genetic": Realizar una búsqueda genética en ventanas aleatorias de cables en cada qubit objetivo
  • ancilla_qubits (Sequence[int] | None) – Lista de índices de qubits físicos (uno por índice en target_qubits) que especifica dónde colocar los ancillas de comprobación en el circuito de salida. Es necesario cuando no es circuit.layout None. ancilla_qubits[i] compartirá puertas de entrelazamiento con target_qubits[i] al llevar a cabo la i-ésima comprobación.

  • check_creg_name (str) – Nombre del registro clásico para las mediciones de control (por defecto: «checks_c»)

  • check_qreg_name (str) – Nombre del registro cuántico que contiene los ancillas de comprobación en los circuitos de salida (por defecto: «checks_q»). Se ignora en modo ISA.

  • seed (int | None) – Semilla aleatoria para controlar la aleatoriedad durante la búsqueda de comprobaciones válidas. Aunque esta semilla controla cierta aleatoriedad en el algoritmo, sigue existiendo cierto indeterminismo al utilizar la función de coste LER o cualquiera de las dos variantes del método de selección genética. La combinación de y cost="gamma" method="windowed" es totalmente determinista si no seed es None.

  • stabilizers (Sequence[Pauli |str] | Literal['all'] | None) – Los estabilizadores del estado preparan circuit la búsqueda de None comprobaciones para las mediciones terminales del circuito. "all" protege a todo el estado. De lo contrario, una secuencia de o Pauli etiquetas en los qubits de circuit según la convención de Qiskit, de modo que el carácter situado más a la derecha de una etiqueta actúa sobre el qubit 0; se permite incluir un signo, aunque se ignora. En el modo ISA, deben actuar como la identidad en cada qubit que no forme parte de la carga útil. Cada uno debe estabilizar el estado preparado, es decir, propagarse hacia atrás a través del circuito hasta un producto de Zs (de lo contrario, a se ValueError eleva). Dado que en este modo no se mide ningún qubit de carga útil, solo readout_noise afecta a los ancillos de comprobación y, por lo tanto, nunca se tiene en cuenta a la hora de calcular el coste.

Devuelve

Una lista de instancias CheckedCircuit : instancias que contienen el circuito básico sin comprobaciones y una para cada comprobación añadida. El elemento final de la salida contiene los CheckedCircuit con comprobaciones para cada qubit de destino, suponiendo que se haya podido encontrar un conjunto válido de comprobaciones.

Subidas

  • ValueError : no circuit hay ninguna puerta de entrelazamiento, por lo que no hay nada que la comprobación pueda proteger; un qubit tiene una instrucción distinta de una barrera tras su medición; o una medición tiene como objetivo un clbit que se encuentra fuera de todos los registros clásicos.
  • ValueError : no circuit tiene ni medidas terminales ni stabilizers, o tiene ambas. Los controles se centran exactamente en uno de los dos.
  • ValueError : una entrada de actúa stabilizers sobre un número de qubits diferente al de circuit, no es un estabilizador del estado preparado (no se propaga de vuelta a un producto de Zs) o, en modo ISA, actúa sobre un qubit ajeno a la carga útil; stabilizers es una secuencia vacía o una cadena distinta de "all".
  • ValueError : target_qubits están fuera de rango o, en modo ISA, no son qubits de carga útil.
  • ValueError : en modo ISA, falta ancilla_qubits , tiene una longitud diferente a la esperada target_qubits, está fuera de rango, repite un qubit o se solapa con la carga útil.
  • ValueError : o check_creg_name check_qreg_name es igual al otro, o el nombre ya circuit existe en un registro.
  • ValueError : no cost es ni "gamma" "LER"; noise_model está vacío, establece idling_noiseo tiene una tasa fuera del rango permitido (véase NoiseModel).

Ejemplo

Las comprobaciones de las medidas de un circuito muestran directamente los resultados:

from qiskit import QuantumCircuit
from qiskit_paulice import NoiseModel, add_pauli_checks

circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.s(1)
circuit.cx(1, 2)
circuit.measure_all()

checked = add_pauli_checks(circuit, [1], NoiseModel(gate_noise=1e-3))[-1]
accept = checked.get_postselection_method()  # takes a bitstring of ``checked.circuit``

Las comprobaciones de los estabilizadores no tienen en cuenta la carga útil. Mídelo como prefieras y, a continuación, vuelve a configurar el circuito comprobado para que, tras la selección, se lean los registros finales:

from dataclasses import replace
from qiskit import ClassicalRegister

payload = circuit.remove_final_measurements(inplace=False)
noise = NoiseModel(gate_noise=1e-3)
checked = add_pauli_checks(payload, [1], noise, stabilizers="all")[-1]

measured = checked.circuit.copy()
measured.h(range(3))  # any basis rotation of the payload
meas = ClassicalRegister(3, "meas")
measured.add_register(meas)
measured.measure(range(3), meas)
checked = replace(checked, circuit=measured)
accept = checked.get_postselection_method()  # takes a bitstring of ``measured``

Referencias

S. Martiel y A. Javadi-Abhari, «Detección de errores con baja sobrecarga mediante códigos espaciotemporales», arXiv:2504.15725. En las secciones complementarias II a VI se describe cómo se determinan los controles eficaces.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.