Servicios de suministro
qiskit_addon_slc.utils
Diversas utilidades.
Este módulo ofrece una serie de funciones de utilidad. Algunas de ellas solo existen de forma temporal para solucionar problemas pendientes de la versión « Qiskit SDK ». Cuando esto ocurre, se marcan como tales y pueden eliminarse sin que se considere obsoleto ni se avise con antelación.
find_indices
find_indices(circuit, bits_or_instruction, /)
Determina los índices de los qubits correspondientes a los índices de bits o a las instrucciones de circuito proporcionados.
¡Esta función no se considera parte de la API estable! Se eliminará sin previo aviso ni fase de obsolescencia cuando el Qiskit SDK admita esa misma funcionalidad de forma nativa. Consulta este número para obtener más detalles.
Una secuencia de bits se asigna a una lista de índices, en el orden en que se proporcionaron los bits:
>>> from qiskit import QuantumCircuit
>>> from qiskit_addon_slc.utils import find_indices>>> circuit = QuantumCircuit(3)
>>> find_indices(circuit, [circuit.qubits[2], circuit.qubits[0]])
[2, 0]Un solo bit se corresponde con un único índice, y una instrucción, con los índices de los qubits sobre los que actúa:
>>> find_indices(circuit, circuit.qubits[1])
1>>> _ = circuit.cx(2, 0)
>>> find_indices(circuit, circuit.data[0])
[2, 0]Parámetros
- circuit (QuantumCircuit) – el circuito cuántico cuyos índices de qubits hay que hallar.
- bits_or_instruction (Bit |CircuitInstruction |Sequence[Bit]) – los bits cuyos índices hay que encontrar. Si se trata de un
CircuitInstruction, se utilizan los qubits sobre los que actúa esta instrucción.
Devuelve
Los índices de los bits consultados en los registros del circuito. Si se ha proporcionado un objeto de un solo bit, int se devuelve un único como su índice. De lo contrario, el tipo de retorno será un list[int] cuya longitud sea igual al número de bits proporcionados.
Subidas
TypeError : cuando bits_or_instruction se proporciona un tipo inesperado de.
Tipo de retorno
generate_noise_model_paulis
generate_noise_model_paulis(instructions, coupling_map=None, circuit=None)
Genera los términos de Pauli de peso 1 y 2 para cada una de las cajas de capas únicas de « 2q » proporcionadas.
Parámetros
- instructions (list[CircuitInstruction]) – : el resultado de
find_unique_box_instructions(). Se da por hecho que cualquiera de las instrucciones proporcionadas o bien consta únicamente de puertas de medición, o bien corresponde a una capa de instrucciones de puertas de 2 qubits. En el primer caso, el modelo de ruido generado contendrá únicamente erroresXde un solo qubit; en el segundo, se incluirán todos los errores de Pauli de peso 1 y 2 en el mapa de acoplamiento reducido. - coupling_map (CouplingMap | None) – el mapa de acoplamiento del backend en el que se han distribuido las instrucciones. En este caso
None, se supone una línea de qubits de tipo « 1d ». - circuit (QuantumCircuit | None) – el circuito transpilado que se ha dispuesto en el mapa de acoplamiento facilitado. Esto solo puede ocurrir
Nonecuando también escoupling_mapNone.
Devuelve
Un diccionario que asocia los ref atributos de la InjectNoise anotación de cada Box único a los términos de Pauli de peso 1 y 2 cuyos errores se han aprendido para ese Box.
Tipo de retorno
dict [ str, QubitSparsePauliList ]
get_extremal_eigenvalue
get_extremal_eigenvalue(spo, *, tol=1e-10, max_cycle=500, max_space=12, lindep=1e-11, **kwargs)
Calcula la norma espectral de un operador de Pauli hermitiano (como valor propio extremal con signo).
Dado un operador hermitiano expresado como una suma ponderada de operadores de Pauli, C = sum_k a_k P_k, esta función devuelve su valor propio más negativo. Dado que dicho operador tiene un espectro simétrico respecto a cero, la magnitud de ese valor propio es la norma espectral del operador ( ||C|| su valor propio más grande en valor absoluto); toma abs() del resultado si eso es lo que necesitas. En este complemento se utiliza para evaluar el límite de error de la norma del conmutador ||[E, O]|| para un error de Pauli y E un observable O.
Esto aprovecha el hecho de que una suma de Paulis se encuentra en un espacio de dimensión 2^(p + c), donde p es el número de pares independientes anticomutativos que generan los Paulis y c cuenta las direcciones conmutativas restantes. Las direcciones de conmutación se conservan, por lo que este operador reducido es diagonal por bloques, con 2^c bloques de tamaño 2^p. Cuando estos bloques son lo suficientemente pequeños, cada uno de ellos se diagonaliza con exactitud, lo que da un resultado exacto con la precisión de la máquina. De lo contrario, el operador reducido se resuelve mediante el solucionador Davidson compilado en Rust (una iteración de Davidson precondicionada diagonalmente, que comprueba si un valor propio convergente tiene otro inferior mediante una breve iteración de Lanczos antes de darlo por válido). Esta ruta es precisa, pero no exacta, y los argumentos que se indican a continuación solo afectan a ella. Crea el operador de 2^(p + c)dimensión total en forma dispersa y almacena varios vectores de esa longitud, por lo que su consumo de memoria aumenta con el número de qubits de spo; se espera que los usuarios que lo invoquen lo limiten, tal y como hacen los cálculos limitados con eigval_max_qubits.
Ten en cuenta la convención de signos: el valor propio devuelto es el más negativo, por lo que la norma espectral es su valor absoluto.
>>> from qiskit.quantum_info import SparsePauliOp
>>> from qiskit_addon_slc.utils import get_extremal_eigenvalue>>> operator = SparsePauliOp(["ZI", "IZ"], [1.0, 0.5])
>>> converged, eigenvalue = get_extremal_eigenvalue(operator)
>>> converged
True
>>> float(eigenvalue)
-1.5
>>> abs(eigenvalue) # the spectral norm
1.5Parámetros
- spo (SparsePauliOp) – el operador hermitiano cuyo valor propio más negativo (y, por tanto, cuya norma espectral) se va a calcular.
- tol (float) – : el umbral de convergencia del solucionador iterativo. Limita la variación del valor propio entre iteraciones y, a menos que predominen los errores de redondeo a la escala de la norma del operador, la norma residual del vector propio.
- max_cycle (int) – : el número máximo de iteraciones del solucionador iterativo.
- max_space (int) – el tamaño máximo del subespacio construido por el solucionador iterativo. Una vez alcanzado, el subespacio se reinicia a partir de sus vectores de Ritz más bajos
max_space // 2. - lindep (float) – la fracción de su norma al cuadrado por debajo de la cual un nuevo vector del subespacio, tras ser ortogonalizado con respecto al subespacio existente, se considera linealmente dependiente de este (y, por lo tanto, se descarta).
- kwargs : obsoleto y se ignora. Antes se pasaban al
pyscf.lib.davidson1solucionador algunos argumentos de palabra clave adicionales que esta función ya no utiliza. Se siguen aceptando por motivos de compatibilidad con versiones anteriores, pero no tienen ningún efecto y generan unDeprecationWarning.
Devuelve
Un par (converged, eigenvalue) . converged indica si el cálculo se ha realizado correctamente (puede que sí, aunque False Davidson no converja). eigenvalue es el valor propio más negativo de spo.
Subidas
ValueError : si no tol es positivo y finito, no max_cycle es positivo, max_space es menor que 2 o no lindep pertenece a [0, 1). Se comprueban todas ellas spo, incluso aquellas que se resuelven de forma exacta.
Tipo de retorno
iter_circuit
iter_circuit(circuit, *, reverse=False, log_process=True)
Recorre las instrucciones de un circuito.
Esta función se ejecuta de forma recursiva en las instrucciones BoxOp .
Se están ignorando las barreras del circuito.
Parámetros
- circuit (QuantumCircuit) – el circuito por el que se va a recorrer.
- reverse (bool) – si se debe recorrer el circuito en orden inverso.
- log_process (bool) – si se debe registrar el proceso.
Cesiones
Tuplas de longitud cuatro, compuestas por la instrucción de circuito detectada, los índices canónicos de los qubits (es decir, los índices enteros de los qubits sobre los que se actúa en el contexto de la entrada circuit) y los atributos InjectNoise : modifier_ref y ref. Es posible que estos dos últimos elementos None indiquen una instrucción de circuito que no formaba parte de un «unrolled BoxOp».
Tipo de retorno
Generador [ tupla [ InstrucciónDeCircuito, lista [ int ], cadena | None, cadena | None]]
map_modifier_ref_to_ref
map_modifier_ref_to_ref(circuit)
Recorrer un circuito y asignar las referencias de las anotaciones InjectNoise .
El cálculo de los límites se basa en modifier_ref, mientras que el modelo de ruido se basa en ref, por lo que esta correspondencia es la que relaciona ambos conceptos. Para ello, es necesario modifier_ref que cada sea único, tal y como se establece al encajonar un circuito con inject_noise_strategy="individual_modification" (véase compute_bounds()). Los recuadros que no tengan ninguna anotación InjectNoise se omiten.
>>> from qiskit import QuantumCircuit
>>> from qiskit.circuit import BoxOp
>>> from samplomatic import InjectNoise
>>> from qiskit_addon_slc.utils import map_modifier_ref_to_ref>>> circuit = QuantumCircuit(2)
>>> for idx in range(2):
... body = QuantumCircuit(2)
... _ = body.cx(0, 1)
... annotation = InjectNoise(ref=f"noise_{idx}", modifier_ref=f"box_{idx}")
... _ = circuit.append(BoxOp(body, annotations=[annotation]), [0, 1])>>> map_modifier_ref_to_ref(circuit)
{'box_0': 'noise_0', 'box_1': 'noise_1'}Parámetros
circuit (QuantumCircuit) – el circuito por el que se va a recorrer.
Devuelve
Un diccionario que asocia cada elemento InjectNoise.modifier_ref a su correspondiente InjectNoise.ref.
Tipo de retorno
remove_measure
remove_measure(circuit)
Elimina todas las operaciones Measure del circuito proporcionado.
Esta función se ejecuta de forma recursiva en las instrucciones BoxOp .
>>> from qiskit import QuantumCircuit
>>> from qiskit_addon_slc.utils import remove_measure>>> circuit = QuantumCircuit(2, 2)
>>> _ = circuit.h(0)
>>> _ = circuit.measure(0, 0)
>>> _ = circuit.cx(0, 1)
>>> dict(sorted(circuit.count_ops().items()))
{'cx': 1, 'h': 1, 'measure': 1}>>> dict(sorted(remove_measure(circuit).count_ops().items()))
{'cx': 1, 'h': 1}El circuito original no se modifica:
>>> dict(sorted(circuit.count_ops().items()))
{'cx': 1, 'h': 1, 'measure': 1}Parámetros
circuit (QuantumCircuit) – el circuito del que hay que eliminar las mediciones.
Devuelve
El circuito sin operaciones de medición.
Tipo de retorno