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)
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):circuittermina 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 encheck_support. El contadorcostconsidera 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 (
stabilizersdados): nocircuitcontiene medidas. Una comprobación es válida si se propaga hacia atrás hasta un estabilizador del estado de entrada , de modo que su síndrome es únicamente el bit auxiliar y sigue siendo válida independientemente de lo que se mida posteriormente. Se consideracostque 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 elCheckedCircuitcondataclasses.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
stabilizersespecifique 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, seValueErroractiva un ). Además, no debestabilizerscontener ninguna medida. El circuito puede definirse en qubits virtuales o físicos. Si el circuito tiene un esquema, el usuario debe proporcionarloancilla_qubits. -
target_qubits (Sequence[int]) – Índices de los qubits
circuitque se utilizarán para entrelazar los qubits de comprobación con la carga útil. Cuandocircuittiene una disposición (modo ISA), se trata de índices de qubits físicos, en el mismo espacio de índices queancilla_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
GateWiseNoiseoLayeredGateNoisese 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 unValueError. -
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 detarget_qubitsforma 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 escircuit.layoutNone.ancilla_qubits[i]compartirá puertas de entrelazamiento contarget_qubits[i]al llevar a cabo lai-é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
LERo cualquiera de las dos variantes del método de selección genética. La combinación de ycost="gamma"method="windowed"es totalmente determinista si noseedesNone. -
stabilizers (Sequence[Pauli |str] | Literal['all'] | None) – Los estabilizadores del estado preparan
circuitla búsqueda deNonecomprobaciones para las mediciones terminales del circuito."all"protege a todo el estado. De lo contrario, una secuencia de oPaulietiquetas en los qubits decircuitsegú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 qubit0; 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 deZs (de lo contrario, a seValueErroreleva). Dado que en este modo no se mide ningún qubit de carga útil, soloreadout_noiseafecta 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
circuithay 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
circuittiene ni medidas terminales nistabilizers, o tiene ambas. Los controles se centran exactamente en uno de los dos. - ValueError : una entrada de actúa
stabilizerssobre un número de qubits diferente al decircuit, no es un estabilizador del estado preparado (no se propaga de vuelta a un producto deZs) o, en modo ISA, actúa sobre un qubit ajeno a la carga útil;stabilizerses una secuencia vacía o una cadena distinta de"all". - ValueError :
target_qubitsestá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 esperadatarget_qubits, está fuera de rango, repite un qubit o se solapa con la carga útil. - ValueError : o
check_creg_namecheck_qreg_namees igual al otro, o el nombre yacircuitexiste en un registro. - ValueError : no
costes ni"gamma""LER";noise_modelestá vacío, estableceidling_noiseo tiene una tasa fuera del rango permitido (véaseNoiseModel).
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.