Notas de la versión de Qiskit 0.39
0.39.5
Terra 0.22.4
Preludio
Qiskit Terra 0.22.4 es una versión de corrección de errores menores, que corrige algunos errores identificados en la serie 0.22.
Corrección de errores
-
Se ha corregido un error en
BackendSamplerque provocaba un error si su métodorun()se llamaba dos veces seguidas. -
Corregidos dos errores en el
ComposedOpdonde el métodoComposedOp.to_matrix()no proporcionaba los resultados correctos para composiciones conStateFny para composiciones con un coeficiente global. Corregido #9283. -
Corregido el problema en el que las primitivas
SampleryEstimatorno funcionaban cuando se les pasaba un circuito connumpy.ndarraycomo parámetro. -
Se ha corregido un error en
SamplingVQEpor el que el argumentoaggregationno tenía efecto. Ahora se puede especificar correctamente la función de agregación y, con ella, el valor de expectativa CVaR. -
Se ha corregido un error de rendimiento por el que
SamplingVQEevaluaba las energías de los estados propios de forma lenta. -
Corregida la autoevaluación de los parámetros beta en
VQDse ha añadido soporte para entradasSparsePauliOpy se ha corregido la función de evaluación de la energía para aprovechar la ejecución asíncrona de las primitivas, recuperando los resultados del trabajo sólo después de que se hayan enviado ambos trabajos. -
Se ha solucionado un problema con los botones
Statevector.probabilities_dict()yDensityMatrix.probabilities_dict()que devolvían resultados incorrectos para sistemas no qubit cuando se especificaba el argumentoqargs. Corregido #9210 -
Corregido el manejo de algunos
classmethods porwrap_method()en Python 3.11. Anteriormente, en Python 3.11,wrap_methodenvolvía la función no ligada asociada aclassmethody luego fallaba cuando se invocaba porque el objeto de clase normalmente ligado aclassmethodno se pasaba a la función. A partir de Python 3.11.1, este problema afectó aQiskitTestCase, impidiendo que fuera importado por otro código de prueba. Corregido #9291.
Aer 0.11.2
No cambia
IBM Proveedor Q 0.19.2
No cambia
0.39.4
Terra 0.22.3
No cambia
Aer 0.11.2
Nuevas funciones
- Añadido soporte para ejecutar Qiskit Aer con Python 3.11 support.
Problemas conocidos
- Corrección de dos errores en AerStatevector. AerStatevector utiliza instrucciones mc*, que no están habilitadas en el método matrix_product_state. Este commit cambia AerStatevector para no usar MC* y usar H, X, Y, Z, U y CX. AerStatevector también falla si una instrucción se descompone en QuantumCircuit vacía. Este commit permite dicha instrucción.
Corrección de errores
-
Se ha corregido el soporte del método
AerSimulator.from_backend()para instanciar una instancia deAerSimulatora partir de un objeto aBackendV2objeto. Anteriormente, al intentar utilizarAerSimulator.from_backend()con un objetoBackendV2aparecía el mensajeAerErrordiciendo que no era compatible. -
Corrige un error por el que
NoiseModel.from_backend()con un objetoBackendV2puede generar un modelo de ruido con un exceso deQuantumErrors en instrucciones no Gate mientras que, por ejemplo, sóloReadoutErrors debería ser suficiente para las medidas. Esta confirmación actualizaNoiseModel.from_backend()con un objetoBackendV2para que devuelva el mismo modelo de ruido que el llamado con el objetoBackendV1correspondiente. Es decir, el modelo de ruido resultante no contiene ningúnQuantumErrors en las medidas y puede contener sólo errores de relajación térmica en otras instrucciones no gate como los resets. Observe que aún contieneReadoutErrors en las medidas. -
Se ha corregido un error en
NoiseModel.from_backend()por el que el uso detemperaturekwarg con un valor no predeterminado calculaba incorrectamente la población de estados excitados para la temperatura especificada. Anteriormente, había un factor adicional de 2 en el cálculo de la distribución de Boltzman que conducía a un valor menor incorrecto para la población del estado excitado. -
Se ha corregido una lógica incorrecta en el compilador de flujo de control que podía permitir que instrucciones no relacionadas aparecieran "dentro" de cuerpos de flujo de control durante la ejecución, provocando resultados incorrectos. Por ejemplo, anteriormente:
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") circuit = QuantumCircuit(3, 3) circuit.measure(0, 0) circuit.measure(1, 1) with circuit.if_test((0, True)): with circuit.if_test((1, False)): circuit.x(2) with circuit.if_test((0, False)): with circuit.if_test((1, True)): circuit.x(2) circuit.measure(range(3), range(3)) print(backend.run(circuit, method=method, shots=100).result())imprimiría
{'010': 100}ya que las operaciones de flujo de control anidadas saltarían accidentalmente sobre la primera puerta X del qubit 2, que debería haberse ejecutado. -
Corrige un error por el que
NoiseModel.from_backend()imprime advertencias verbose al suministrar un backend que informa de parámetros de dispositivo no físicos como T2 > 2 * T1 debido a errores estadísticos en su estimación. Esta confirmación elimina estas advertencias porque no son procesables por los usuarios, en el sentido de que no hay más medios que truncarlas hasta los límites teóricos, como se hace en el módulonoise.device. Consulte el número 1631 para obtener más información sobre el error corregido. -
Se trata de una corrección para el simulador de vectores de estado de la GPU. La distribución de trozos intentó asignar toda la memoria libre en la GPU, pero esto provoca un error de asignación de memoria. Así que este arreglo asigna el 80 por ciento de la memoria libre. También fija el tamaño del búfer de la matriz cuando se aplica el muestreo de ruido.
-
Se trata de una corrección de AerState que funciona con bloqueo de caché. AerState configuró mal el transpilador de Aer para el bloqueo de la caché, y entonces su algoritmo para intercambiar qubits funcionó mal. Esta corrección corrige AerState para utilizar este transpilador. Más concretamente, tras la transpilación, un mapa de qubits intercambiados se recupera al mapa original cuando se utiliza AerState. Esta corrección es necesaria para que AerStatevector pueda utilizar varias GPU.
-
Esta es la solución para AerStatevector. No ha sido posible crear una instancia de AerStatevector directamente a partir del vector de estado de terra. Esta corrección permite un vector de estado como entrada en AerStatevector’s.
-
SamplerResult.quasi_distscontienen los datos sobre el número de qubits.QuasiDistribution.binary_probabilities()devuelve cadenas de bits con la longitud correcta. -
Previamente la semilla no se inicializa en AerStatevector y entonces los resultados muestreados son siempre los mismos. Con este commit, se inicializa una semilla para cada muestreo y se pueden variar los resultados muestreados.
IBM Proveedor Q 0.19.2
No cambia
0.39.3
Terra 0.22.3
Preludio
Qiskit Terra 0.22.3 es una versión de corrección de errores menores, que corrige algunos errores más en la serie 0.22.
Corrección de errores
-
AdaptVQEahora indica correctamente que admite operadores auxiliares. -
Los cajones de los circuitos (
QuantumCircuit.draw()ycircuit_drawer()) ya no emitirán una advertencia sobre el parámetrocregbundlecuando se utilicen los argumentos por defecto, si el contenido del circuito requiere que todos los bits se dibujen individualmente. Esto era más probable que apareciera al intentar dibujar circuitos con operaciones de flujo de control del nuevo estilo. -
Se ha corregido un error por el que
QNSPSAfallaba cuandomax_evals_groupedtenía un valor superior a 1. -
Se ha corregido un problema con el pase
SabreSwapque provocaba que la salida de varias ejecuciones del pase sin el argumentoseedespecificado reutilizara la misma semilla generadora de números aleatorios entre ejecuciones en lugar de utilizar semillas diferentes. Anteriormente, esto provocaba que se obtuvieran resultados idénticos entre ejecuciones incluso cuando no se especificabaseed. -
Solucionado un problema con las clases primitivas,
BackendSampleryBackendEstimatorcuyas instancias no podían serializarse conpickle. En general, no se garantiza que estas clases sean serializables comoBackendV2yBackendV1no tienen que ser serializables (y a menudo no lo son), pero las definiciones de clase deBackendSampleryBackendEstimatorya no impiden el uso depickle. -
El método
pulse.Instruction.draw()tendrá ahora éxito, como antes. Este método está obsoleto y no está previsto sustituirlo, pero debería seguir funcionando durante el periodo de obsoleto.
Aer 0.11.1
No cambia
IBM Proveedor Q 0.19.2
No cambia
0.39.2
Terra 0.22.2
Preludio
Qiskit Terra 0.22.2 es una versión de corrección de errores menores, y marca el primer soporte oficial para Python 3.11.
Corrección de errores
-
Se ha solucionado un problema con las clases primitivas del backend
BackendSampleryBackendEstimatorque impedía la ejecución con una instanciaBackendV1que no tuviera un campomax_experimentsdefinido en su campoBackendConfiguration. -
Se ha corregido un error en el método
VF2PostLayoutcuando se transpilaba para backends con una definición deTargetdonde el gráfico de interacción se construía incorrectamente. Esto podría dar lugar a tiempos de ejecución excesivos debido a que el gráfico es mucho más complejo de lo necesario. -
El analizador sintáctico de expresiones Pulse ya no debería colgarse periódicamente cuando se llama desde cuadernos Jupyter. Esto se consigue evitando un
deepycopyinterno de un objeto recursivo que parecía ser particularmente difícil de evaluar para la memoización.
Aer 0.11.1
No cambia
IBM Proveedor Q 0.19.2
No cambia
0.39.1
Terra 0.22.1
Preludio
Qiskit Terra 0.22.1 es una versión de corrección de errores, que aborda algunos problemas menores identificados desde la versión 0.22.0.
Notas sobre características en desuso
- El kwarg
pauli_listdepauli_basis()ha quedado obsoleto, ya quepauli_basis()ahora siempre devuelve unPauliList. Este argumento se eliminó prematuramente de Qiskit Terra 0.22.0, lo que rompió la compatibilidad para los usuarios que utilizabanpauli_list``argument. Now, the argument has been restored but will emit a ``DeprecationWarning. Si se utiliza no tiene ningún efecto porque desde Qiskit Terra 0.22.0 aPauliListsiempre se devuelve.
Corrección de errores
-
Corregido el
BarrierBeforeFinalMeasurementspaso del transpilador cuando hay condiciones en sueltasClbits inmediatamente antes de la capa de medición final. Anteriormente, esto fallaba alegando que el bit no estaba presente en un circuito temporal interno. Corregido #8923 -
Los comprobadores de igualdad para
QuantumCircuityDAGCircuit(con objetos del mismo tipo) tratarán ahora correctamente las condiciones sobre bits individuales. Anteriormente, esto producía falsos negativos para la igualdad, ya que los bits utilizaban comprobaciones de igualdad "exactas" en lugar de las comprobaciones "semánticas" que reciben el resto de propiedades de las instrucciones de circuito. -
Manipulación fija de bits clásicos en
StochasticSwapcon el flujo de control. Anteriormente, las operaciones de flujo de control se expandían para contener todos los bits clásicos del circuito exterior y no se volvían a contraer, lo que provocaba un desajuste entre el número de clbits que la instrucción informaba necesitar y el número real que se le suministraba. Corregido #8903 -
Corregido el manejo de instrucciones definidas globalmente para la
Targetclase. Anteriormente, dos métodosoperations_for_qargs()yoperation_names_for_qargs()ignoraban/manejaban incorrectamente cualquier operación ideal definida globalmente presente en el objetivo. Por ejemplo:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target(num_qubits=5) target.add_instruction(CXGate()) names = target.operation_names_for_qargs((1, 2)) ops = target.operations_for_qargs((1, 2))devolverá ahora
{"cx"}paranamesy[CXGate()]paraopsen lugar de generar unKeyErroro un retorno vacío. -
Se ha corregido un problema en el método
Target.add_instruction()que anteriormente aceptaba un argumento con un número no válido de qubits como parte del argumentoproperties. Por ejemplo:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target() target.add_instruction(CXGate(), {(0, 1, 2): None})Ahora se mostrará correctamente
TranspilerErroren lugar de causar problemas en tiempo de ejecución al interactuar con el objetivo. Corregido #8914 -
Se ha corregido un problema con la función
plot_state_hinton()que daba lugar a un eje mal colocado y desplazado del gráfico real. Corregido #8446 <https://github.com/Qiskit/qiskit/issues/8446> -
Se ha corregido la salida de la función
plot_state_hinton()para que las etiquetas de estado se ordenen correctamente y la imagen coincida con la ordenación natural de la matriz. Corregido #8324 -
Solucionado un problema con las clases primitivas,
BackendSampleryBackendEstimatorcuando se ejecuta en backends que tienen un número limitado de circuitos en cada trabajo. No todos los backends admiten un tamaño de lote ilimitado (la mayoría de los backends de hardware no lo hacen) y anteriormente las clases primitivas del backend habrían enviado potencialmente de forma incorrecta más circuitos de los que el backend admitía. Esto se ha corregido para queBackendSampleryBackendEstimatordividirá los circuitos en varios trabajos si el backend tiene un número limitado de circuitos por trabajo. -
Se ha solucionado un problema con la clase
BackendEstimatorpor el que, al establecer una opción de ejecución denominadamonitoren un valor que se evaluaba comoTrue, se activaba incorrectamente un monitor de trabajo que sólo funcionaba con backends del paqueteqiskit-ibmq-provider. Esto se ha eliminado para que pueda utilizar una opción de ejecuciónmonitorsi es necesario sin causar ningún problema. -
Se ha corregido un problema con el método
Target.build_coupling_map()que devolvía incorrectamenteNonepara un objetoTargetcon una mezcla de instrucciones ideales disponibles globalmente e instrucciones con restricciones de qubits. Ahora bien, en estos casos elTarget.build_coupling_map()devolverá un mapa de acoplamiento para la instrucción restringida (a menos que sea una operación de 2 qubits que devolveráNoneporque globalmente no hay restricción de conectividad). Corregido #8971 -
Se ha corregido un problema con el atributo
Target.qargsque devolvía incorrectamenteNonepara un objetoTargetque contenía cualquier instrucción ideal disponible globalmente. -
Se ha corregido la eliminación prematura del argumento de la palabra clave
pauli_listde la funciónpauli_basis()que rompía el código existente utilizando la ruta de compatibilidad futurapauli_list=Trueen la actualización a Qiskit Terra 0.22.0. Este argumento de palabra clave se ha añadido de nuevo a la función y ahora está obsoleto y se eliminará en una futura versión. -
Se ha corregido un problema en la serialización QPY (
dump()) cuando una subclaseControlledGateque sobrecargaba el método_define()para proporcionar una definición personalizada para la operación. Anteriormente, este caso de operación no se serializaba correctamente porque no se tenía en cuenta el uso del método potencialmente_define()para proporcionar una definición. Correcciones #8794 -
La deserialización QPY ya no añadirá instancias
Clbitinstancias al circuito si hay tanto looseClbits en el circuito y másQubits queClbits. -
La deserialización de QPY ya no añadirá registros llamados q y c si el circuito de entrada sólo contenía bits sueltos.
-
Corregido el
SparsePauliOp.dot()cuando se ejecuta en dos operadores con coeficientes reales. Para solucionarlo, el dtype que puede tomarSparsePauliOpse restringe anp.complex128yobject. Corregido #8992 -
Se ha corregido un problema en la función
circuit_drawer()y el métodoQuantumCircuit.draw()por el que el único estilo incorporado para la salida demplque se podía utilizar eradefault. Si se utilizara otro estilo incorporado, comoiqx, se emitiría una advertencia de que no se encuentra el estilo y el cajón volvería a utilizar el estilodefault. Corregido #8991 -
Se ha solucionado un problema con la función
transpile()que anteriormente fallaba con unTypeErrorsi se pasaba un objeto personalizadoTargetmediante el argumentotargety se especificaba una lista de varios circuitos para el argumentocircuits. -
Se ha corregido un problema con
transpile()cuando se apuntaba a unTarget(ya sea directamente a través del argumentotargeto a través de una instancia deBackendV2del argumentobackend) que contenía una instrucción idealMeasure(una que no tiene ninguna propiedad definida). Antes se producía una excepción al intentar analizar el objetivo. Corregido #8969 -
Se ha solucionado un problema con el
VF2Layoutcuando se ejecutaba con unTargetque tenía instrucciones a las que les faltaban tasas de error. Esto se ha corregido para que, en tales casos, la falta de una tasa de error se trate como una implementación ideal y, si no hay tasas de error presentes, sólo seleccionará el primer diseño coincidente. Corregido #8970 -
Se ha solucionado un problema con el
VF2PostLayoutcuando se ejecutaba con unTargetque tenía instrucciones que faltaban. En estos casos, la ausencia de porcentaje de error se considerará una ejecución ideal de la operación. -
Se ha corregido un problema con la clase
VQDsi se calculaban más dek=2valores propios. Anteriormente esto fallaba debido a un desajuste de tipo interno, pero ahora se ejecuta como se espera. Corregido #8982 -
Se ha corregido un error de rendimiento por el que los nuevos algoritmos variacionales basados en primitivas
minimum_eigensolvers.VQE,eigensolvers.VQDySamplingVQEno realizaban evaluaciones de energía por lotes de forma predeterminada, lo que provocaba una ralentización significativa si se utilizaba un backend de hardware. -
Las puertas e instrucciones de operando cero funcionarán ahora con
circuit_to_gate(),QuantumCircuit.to_gate(),Gate.control()y la construcción de unOperatora partir de unQuantumCircuitque contenga instrucciones operando por cero. Este caso de borde es ocasionalmente útil en la creación de puertas de fase global como parte de instrucciones compuestas más grandes, aunque para muchos usos,QuantumCircuit.global_phasepuede ser más apropiado. -
Soluciona el problema por el que
Statevector.evolve()yDensityMatrix.evolve()provocaba un error en la evolución de subsistemas anidados para subsistemas no qubits. Soluciona el problema #8897 -
Se corrige un error en
Statevector.evolve()por el que la evolución del subsistema devolverá el valor incorrecto en ciertos casos en los que hay 2 o más subsistemas no evolucionados con diferentes dimensiones del subsistema. Soluciona el problema #8899
Aer 0.11.1
Corrección de errores
-
Se ha corregido un posible error de compilación al intentar utilizar CMake 3.18 o posterior y compilar qiskit-aer con soporte para GPU activado. Desde CMake 3.18 o posterior, cuando se compila con CUDA, es necesario configurar
CMAKE_CUDA_ARCHITECTUREScon el valor de arquitectura de la GPU de destino. Esto se ha corregido para que se utilice la configuraciónAER_CUDA_ARCHsi no estaba configurada. -
Corrige un error en el manejo de instrucciones con clbits en
LocalNoisePass. Anteriormente, se borraban accidentalmente clbits de instrucciones (por ejemplo, medidas) a los que se aplica el ruido en el caso demethod="append". -
Se ha corregido la sobrecarga de rendimiento de la clase Sampler cuando se ejecuta con circuitos idénticos en varias ejecuciones. Esto se consiguió saltándose/almacenando en caché la transpilación de estos circuitos idénticos en ejecuciones posteriores.
-
Corregida la compatibilidad de las clases primitivas
SampleryEstimatorcon la versión qiskit-terra 0.22.0. En qiskit-terra 0.22.0 se introdujeron cambios en la interfaz abstracta que rompieron la compatibilidad con estas clasesSampleryEstimatorpueden utilizarse ahora con qiskit-terra >= 0.22.0.
IBM Proveedor Q 0.19.2
No cambia
0.39.0
Esta versión también deja oficialmente obsoleto el proyecto Qiskit Aer como parte del metapaquete Qiskit. Esto significa que en una futura versión pip install qiskit ya no incluirá qiskit-aer. Si actualmente está instalando o listando qiskit como una dependencia para obtener Aer debe actualizar esto para listar explícitamente qiskit-aer también.
El proyecto qiskit-aer sigue activo y se mantiene en el futuro, pero para el metapaquete Qiskit (es decir, lo que se instala a través de pip install qiskit) el proyecto se está moviendo hacia un modelo en el que el paquete Qiskit sólo contiene la funcionalidad básica común para construir y compilar circuitos cuánticos, programas y aplicaciones, y los paquetes que se basan en él o enlazan Qiskit con hardware o simuladores son paquetes separados.
Terra 0.22.0
Preludio
La versión de Qiskit Terra 0.22.0 es una versión de características principales que incluye una miríada de nuevas funciones y correcciones de errores. Los aspectos más destacados de esta versión son:
- Añadir soporte inicial al transpilador para transpilar
QuantumCircuitque contienen instrucciones de flujo de control comoForLoopOpyWhileLoopOp.- Escalado y rendimiento muy mejorados para la función
transpile()con un gran número de qubits, especialmente cuando se utilizaoptimization_level=3.- Interfaz de plugin externo para
transpile()que permite a los paquetes externos implementar etapas para los gestores de pases predeterminados. Encontrará más información al respecto enqiskit.transpiler.preset_passmanagers.plugin. Además,BackendV2los backends ahora pueden establecer opcionalmente plugins personalizados por defecto para usar en las etapas de programación y traducción.- Implementaciones actualizadas de algoritmos en
qiskit.algorithmsque aprovechan las clasesprimitivesque implementan las clasesBaseSampleryBaseEstimator.
Nuevas funciones
-
Añadir soporte para representar una operación que tiene un ancho variable a la clase
Targetclase. Anteriormente, un objetoTargetnecesitaba tener una instancia deOperationdefinida para cada operación soportada en el objetivo. Se utilizó tanto para validar los argumentos como los parámetros de la operación. Sin embargo, para las operaciones que tienen una anchura variable esto no era posible porque cada instancia de una claseOperationsólo puede tener un número fijo de qubits. En los casos en que un backend admita operaciones de anchura variable, la instrucción puede añadirse con la clase de la operación en lugar de una instancia. En tales casos, la operación se considerará globalmente compatible con todos los qubits. Por ejemplo, si se construye un objetivo como:from qiskit.circuit import Parameter, Measure, IfElseOp, ForLoopOp, WhileLoopOp from qiskit.circuit.library import IGate, RZGate, SXGate, XGate, CXGate from qiskit.transpiler import Target, InstructionProperties theta = Parameter("theta") ibm_target = Target() i_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(IGate(), i_props) rz_props = { (0,): InstructionProperties(duration=0, error=0), (1,): InstructionProperties(duration=0, error=0), (2,): InstructionProperties(duration=0, error=0), (3,): InstructionProperties(duration=0, error=0), (4,): InstructionProperties(duration=0, error=0), } ibm_target.add_instruction(RZGate(theta), rz_props) sx_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(SXGate(), sx_props) x_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(XGate(), x_props) cx_props = { (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713), (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713), (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929), (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929), (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659), (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659), (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201), (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201), } ibm_target.add_instruction(CXGate(), cx_props) measure_props = { (0,): InstructionProperties(duration=5.813e-6, error=0.0751), (1,): InstructionProperties(duration=5.813e-6, error=0.0225), (2,): InstructionProperties(duration=5.813e-6, error=0.0146), (3,): InstructionProperties(duration=5.813e-6, error=0.0215), (4,): InstructionProperties(duration=5.813e-6, error=0.0333), } ibm_target.add_instruction(Measure(), measure_props) ibm_target.add_instruction(IfElseOp, name="if_else") ibm_target.add_instruction(ForLoopOp, name="for_loop") ibm_target.add_instruction(WhileLoopOp, name="while_loop")En
IfElseOp,ForLoopOpyWhileLoopOpse admiten globalmente para cualquier número de qubits. Esto se refleja en otras llamadas de laTargetAPI comoinstruction_supported():ibm_target.instruction_supported(operation_class=WhileLoopOp, qargs=(0, 2, 3, 4)) ibm_target.instruction_supported('if_else', qargs=(0, 1))ambos devuelven
True. -
Añadidas nuevas implementaciones de primitivas
BackendSampleryBackendEstimator. aqiskit.primitives. Estas nuevas implementaciones de clases primitivas envuelven una claseBackendV1oBackendV2como una instancia deBaseSampleroBaseEstimatorrespectivamente. El caso de uso previsto para estas implementaciones primitivas es tender un puente entre los proveedores que no tienen implementaciones primitivas nativas y utilizan el backend de ese proveedor con APIs que funcionan con primitivas. Por ejemplo, la claseSamplingVQEnecesita una instanciaBaseSamplerpara funcionar. Si desea ejecutar esa clase con un backend de un proveedor sin una implementación primitiva nativa, puede construir una claseBackendSamplerpara ello:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import BackendSampler from qiskit.providers.fake_provider import FakeHanoi from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp backend = FakeHanoi() sampler = BackendSampler(backend=backend) operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalueSi está utilizando un proveedor que tiene implementaciones primitivas nativas (como
qiskit-ibm-runtimeoqiskit-aer) siempre es una mejor opción utilizar esa implementación primitiva nativa en lugar deBackendEstimatoroBackendSamplerya que las implementaciones nativas serán mucho más eficientes y/o harán pre y post procesamiento adicional.BackendEstimatoryBackendSamplerestán diseñados para ser genéricos que pueden trabajar con cualquier backend que devuelveCountsen suResultslo que excluye una optimización adicional. -
Añadida una nueva clase de algoritmo
AdaptVQEaqiskit.algorithmsEste algoritmo utiliza unqiskit.algorithms.minimum_eigensolvers.VQEen combinación con un conjunto de operadores deqiskit.circuit.library.EvolvedOperatorAnsatzde forma adaptativa. Por ejemplo:from qiskit.algorithms.minimum_eigensolvers import AdaptVQE, VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.primitives import Estimator from qiskit.circuit.library import EvolvedOperatorAnsatz # get your Hamiltonian hamiltonian = ... # construct your ansatz ansatz = EvolvedOperatorAnsatz(...) vqe = VQE(Estimator(), ansatz, SLSQP()) adapt_vqe = AdaptVQE(vqe) result = adapt_vqe.compute_minimum_eigenvalue(hamiltonian) -
La clase
BackendV2admite ahora dos nuevos puntos de conexión opcionales que permiten a los backends inyectar pasos de compilación personalizados como parte de la clasetranspile()ygenerate_preset_pass_manager(). Si unaBackendV2incluye los métodosget_scheduling_stage_plugin()oget_translation_stage_plugin(), el transpilador utilizará la cadena devuelta como valor por defecto para los argumentosscheduling_methodytranslation_method. Esto permite a los backends ejecutar pases de transpilador personalizados adicionales cuando se dirigen a ese backend aprovechando la interfaz de etapa de transpiladorplugindel transpilador. Para más detalles sobre cómo utilizarlo, consulte: Pases de transpilador personalizados. -
Se ha añadido un nuevo argumento de palabra clave,
ignore_backend_supplied_default_methods, a la funcióntranspile()que puede utilizarse para desactivar la selección personalizada de un método predeterminado por parte de un backend si el backend de destino tiene definidosget_scheduling_stage_plugin()oget_translation_stage_plugin(). -
Se ha añadido un parámetro
labelalBarriery al métodobarrier()que permite al usuario asignar una etiqueta a una instancia de la directivaBarrierdirectiva. Para visualizaciones generadas concircuit_drawer()oQuantumCircuit.draw()esta etiqueta se imprimirá en la parte superior debarrier.from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.h(1) circuit.barrier(label="After H") circuit.draw('mpl') -
Añadir nuevas puertas
CCZGate,CSGateyCSdgGatea las puertas estándar de la Biblioteca de Circuitos (qiskit.circuit.library). -
Se ha añadido el paquete
qiskit.algorithms.eigensolverspara incluir interfaces para algoritmos con primitivas. Este nuevo módulo acabará sustituyendo al anteriorqiskit.algorithms.eigen_solvers. Este nuevo módulo contiene una implementación alternativa delVQDque en lugar de tomar un backend oQuantumInstancetoma una instancia deBaseEstimatorincluyendoEstimator,BackendEstimatoro cualquier implementación de proveedor como las presentes enqiskit-ibm-runtimeyqiskit-aer.Por ejemplo, para utilizar la nueva implementación con una instancia de
Estimatorclasefrom qiskit.algorithms.eigensolvers import VQD from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler, Estimator from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp h2_op = PauliSumOp(SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], )) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() fidelity = ComputeUncompute(Sampler()) vqd = VQD(estimator, fidelity, ansatz, optimizer, k=2) result = vqd.compute_eigenvalues(h2_op) eigenvalues = result.eigenvaluesNótese que los operadores auxiliares evaluados se obtienen ahora a través del campo
aux_operators_evaluatedsobre los resultados. Consistirá en una lista o dict de tuplas que contendrán los valores de expectativa de estos operadores, así como los metadatos de ejecución primitiva.aux_operator_eigenvaluesya no es un campo válido. -
Añadidos nuevos algoritmos para calcular fidelidades/solapamientos de estado para pares de circuitos cuánticos (que pueden ser parametrizados). Además de la clase base (
BaseStateFidelity) que define la interfaz, existe una implementación del método computar-descomputar que aprovecha las instancias de la claseBaseSamplerprimitiva:qiskit.algorithms.state_fidelities.ComputeUncompute.Por ejemplo:
import numpy as np from qiskit.primitives import Sampler from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.circuit.library import RealAmplitudes sampler = Sampler(...) fidelity = ComputeUncompute(sampler) circuit = RealAmplitudes(2) values = np.random.random(circuit.num_parameters) shift = np.ones_like(values) * 0.01 job = fidelity.run([circuit], [circuit], [values], [values+shift]) fidelities = job.result().fidelities -
Se ha añadido un nuevo módulo
qiskit.algorithms.gradientsque contiene clases que se utilizan para calcular gradientes utilizando las interfaces primitivas definidas enqiskit.primitives. Hay 4 tipos de clases de gradiente: Diferencia Finita, Desplazamiento de Parámetros, Combinación Lineal Unitaria y SPSA con implementaciones que o bien utilizan una instancia de la interfazBaseEstimatorinterfaz:o una instancia de la
BaseSamplerinterfaz:Los gradientes basados en el estimador calculan el gradiente de los valores de las expectativas, mientras que los gradientes basados en el muestreador devuelven gradientes de los resultados de las mediciones (también denominados "gradientes de probabilidad").
Por ejemplo:
estimator = Estimator(...) gradient = ParamShiftEstimatorGradient(estimator) job = gradient.run(circuits, observables, parameters) gradients = job.result().gradients -
La clase
Grovertiene un nuevo argumento de palabra clave,sampler, que se utiliza para ejecutar el algoritmo utilizando una instancia de la interfazBaseSamplerpara calcular los resultados. Este nuevo argumento sustituye al argumentoquantum_instancey, en consecuencia,quantum_instanceestá pendiente de desaprobación y será desaprobado y posteriormente eliminado en futuras versiones.Ejemplo:
from qiskit import QuantumCircuit from qiskit.primitives import Sampler from qiskit.algorithms import Grover, AmplificationProblem sampler = Sampler() oracle = QuantumCircuit(2) oracle.cz(0, 1) problem = AmplificationProblem(oracle, is_good_state=["11"]) grover = Grover(sampler=sampler) result = grover.amplify(problem) -
Se ha añadido una nueva opción,
"formatter.control.fill_waveform", a las hojas de estilo del cajón de pulso (pulse_v2.draw()ySchedule.draw()). Esta opción se puede utilizar para eliminar el color de la cara de los pulsos en la visualización de salida, lo que permite dibujar pulsos sólo con líneas.Por ejemplo:
from qiskit.visualization.pulse_v2 import IQXStandard my_style = IQXStandard( **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2} ) my_sched.draw(style=my_style) -
Añadido un nuevo pase transpiler,
ResetAfterMeasureSimplificationque se utiliza para sustituir una operaciónResetdespués de una operaciónMeasurepor una condicionalXGate. Este pase se puede utilizar en backends donde unaResetoperación se realiza haciendo una medición y luego una puerta X condicional para que esto elimine el duplicado implícitoMeasurede laResetoperación. Por ejemplo:from qiskit import QuantumCircuit from qiskit.transpiler.passes import ResetAfterMeasureSimplification qc = QuantumCircuit(1) qc.measure_all() qc.reset(0) qc.draw('mpl')result = ResetAfterMeasureSimplification()(qc) result.draw('mpl') -
Añadido un nuevo valor soportado,
"reverse_linear"para el argumento de la palabra claveentanglemental constructor de la claseNLocalclase circuito. EnTwoLocal(que son subclases deNLocal), sientanglement_blocks="cx", el uso deentanglement="reverse_linear"proporciona un circuito n-qubit equivalente aentanglement="full"pero con sóloCXGateen lugar de . -
ScheduleBlockse ha actualizado para que pueda gestionar subrutinas no asignadas, es decir, para permitir la llamada perezosa a otros programas. Por ejemplo, esto permite el siguiente flujo de trabajo:from qiskit import pulse with pulse.build() as prog: pulse.reference("x", "q0") with pulse.build() as xq0: pulse.play(Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) prog.assign_references({("x", "q0"): xq0})Ahora un usuario puede crear
progsin conocer la implementación real de la referencia("x", "q0"), y asignarla en un momento posterior para su ejecución. Esto mejora la modularidad de los programas de pulsos, y así se puede escribir fácilmente una plantilla de programa de pulsos que se base en otras calibraciones.Para realizar esta función, se ha añadido la nueva instrucción pulse (directiva del compilador)
Referencese ha añadido. Esta instrucción se inyecta en el ámbito del constructor actual cuando se utiliza el comandoreference()se utiliza. Todas las referencias definidas en el programa de pulsos actual pueden listarse con la propiedadreferences.Además, cada referencia se gestiona con un ámbito para facilitar la gestión de parámetros.
scoped_parameters()ysearch_parameters()se han añadido aScheduleBlock. Consulte la documentación de la API para obtener más detalles. -
Añadido un nuevo método
SparsePauliOp.argsort()que devuelve la composición de permutaciones en el orden de ordenación por coeficiente y ordenación por Pauli. Utilizando la palabra claveweightcomo argumento para el método, la salida puede ordenarse adicionalmente por el número de términos no idénticos en el Pauli, donde el conjunto de todos los Paulis de un peso dado siguen ordenados lexicográficamente. -
Añadido un nuevo método
SparsePauliOp.sort()que primero ordenará los coeficientes usandoargsort()de numpy y luego ordenará por Pauli, donde la ordenación Pauli tiene prioridad. Si la ordenación Pauli es la misma, entonces se ordenará por coeficiente. Utilizando el argumento de la palabra claveweight, la salida puede ordenarse adicionalmente por el número de términos no idénticos en el Pauli, donde el conjunto de todos los Paulis de un peso dado siguen ordenados lexicográficamente. -
Se ha añadido un nuevo argumento de palabra clave,
wire_order, a la funcióncircuit_drawer()función yQuantumCircuit.draw()que permite reordenar arbitrariamente tanto los bits cuánticos como los clásicos en la visualización de salida. Por ejemplo:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(4, "q") cr = ClassicalRegister(4, "c") cr2 = ClassicalRegister(2, "ca") circuit = QuantumCircuit(qr, cr, cr2) circuit.h(0) circuit.h(3) circuit.x(1) circuit.x(3).c_if(cr, 10) circuit.draw('mpl', cregbundle=False, wire_order=[2, 1, 3, 0, 6, 8, 9, 5, 4, 7]) -
Se ha añadido compatibilidad con el
CSGate,CSdgGateyCCZGateal constructor de la clase de operadorCNOTDihedral. Los circuitos de entrada al crear unCNOTDihedralahora admitirán circuitos que utilicen estas puertas. Por ejemplo:from qiskit import QuantumCircuit from qiskit.quantum_info import CNOTDihedral qc = QuantumCircuit(2) qc.t(0) qc.cs(0, 1) qc.tdg(0) operator = CNOTDihedral(qc) -
Las clases del algoritmo de estimación de la amplitud:
Ahora tienen un nuevo argumento de palabra clave,
sampleren su constructor que toma una instancia de un objeto que implementa la interfazBaseSamplerinterfaz incluyendoBackendSamplerSampler, o cualquier implementación de proveedores como las presentes en qiskit-ibm-runtime y qiskit-aer. Esto proporciona una alternativa al uso del argumentoquantum_instancepara establecer el objetivoBackendoQuantumInstancepara ejecutar el algoritmo. El uso de aQuantumInstanceestá pendiente de ser obsoleto y lo será en una futura versión. -
Añadida una nueva clase,
BackendV2Converterque se utiliza para envolver una instanciaBackendV1en una interfazBackendV2interfaz. Le permite disponer de unaBackendV2instancia de cualquierBackendV1. Esto permite estandarizar los patrones de acceso en la nuevaBackendV2aunque siga soportando la interfazBackendV1. -
Se ha añadido una nueva función
convert_to_target()que se utiliza para tomar unBackendConfigurationy opcionalmente unBackendPropertiesyPulseDefaultsy crear un objetoTargetequivalente al contenido de dichos objetos. -
qiskit.quantum_info.BaseOperatorsubclases (comoScalarOp,SparsePauliOpyPauliList) pueden utilizarse ahora con la función integrada Pythonsum(). -
Se ha añadido un nuevo transpilador pass,
ConvertConditionsToIfOpsque puede utilizarse para convertir instrucciones condicionadas de estilo antiguo en instrucciones condicionadas de estilo antiguoInstruction.c_if()-instrucciones condicionadas enIfElseOpobjetos. Esto es para ayudar a facilitar la transición del tipo antiguo al nuevo para los backends. Para la mayoría de los usuarios, no hay necesidad de añadir esto a sus gestores de pases, y no está incluido en ningún gestor de pases preestablecido. -
Refactorización del análisis de conmutatividad de puertas en una clase
CommutationChecker. Esta clase le permite comprobar (basándose en la multiplicación de matrices) si dos puertas conmutan o no conmutan, y almacenar en caché los resultados (de modo que una comprobación similar en el futuro ya no requiera la multiplicación de matrices).Por ejemplo, ahora podemos hacer:
from qiskit.circuit import QuantumRegister, CommutationChecker comm_checker = CommutationChecker() qr = QuantumRegister(4) res = comm_checker.commute(CXGate(), [qr[1], qr[0]], [], CXGate(), [qr[1], qr[2]], [])Como las dos puertas CX conmutan (la primera puerta CX está sobre los qubits
qr[1]yqr[0], y la segunda puerta CX está sobre los qubitsqr[1]yqr[2]), tendremos queresesTrue.Esta comprobación de conmutatividad es excesivamente conservadora para puertas condicionales y parametrizadas, y puede devolver
Falseincluso cuando dichas puertas conmutan. -
Añadido un nuevo pase de transpilador
CommutativeInverseCancellationque cancela pares de puertas inversas explotando las relaciones de conmutación entre puertas. Este paso es una generalización del paso transpilerInverseCancellationya que detecta un conjunto mayor de puertas inversas y tiene en cuenta la conmutatividad. El pase también evita algunos problemas asociados con el pase del transpiladorCommutativeCancellation.Por ejemplo:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(2) circuit.z(0) circuit.x(1) circuit.cx(0, 1) circuit.z(0) circuit.x(1) passmanager = PassManager(CommutativeInverseCancellation()) new_circuit = passmanager.run(circuit)anula el par de compuertas Z autoinversas y el par de compuertas X autoinversas (ya que las compuertas correspondientes conmutan con la compuerta CX), produciendo un circuito formado por una única compuerta CX.
La comprobación inversa es excesivamente conservadora para las puertas condicionales y parametrizadas, y puede no cancelar algunas de ellas.
-
QuantumCircuit.compose()aceptará ahora un operando con bits clásicos si el circuito base no tiene ninguno. El patrón de componer un circuito con medidas sobre un circuito sólo cuántico es ahora válido. Por ejemplo:from qiskit import QuantumCircuit base = QuantumCircuit(3) terminus = QuantumCircuit(3, 3) terminus.measure_all() # This will now succeed, though it was previously a CircuitError. base.compose(terminus) -
Los métodos
DAGCircuitmétodosdepth()ysize()tienen un nuevo argumento de palabra claverecursepara su uso con circuitos que contienen operaciones de flujo de control (comoIfElseOp,WhileLoopOpyForLoopOp). Por defecto esFalsey lanzará un error si hay operaciones de flujo de control, para evitar resultados mal definidos. Si se establece enTrue, se devuelve un valor proxy que intenta ponderar equitativamente cada bloque de flujo de control en relación con su condición, aunque la profundidad o el tamaño de una ejecución concreta sea generalmente desconocida. Consulte la documentación de cada método para saber cómo afecta a la salida cada operación de flujo de control. -
DAGCircuit.count_ops()ganó un argumento de palabra claverecursepara recursar en bloques de flujo de control. Por defecto esTrue, y se devolverán todas las operaciones de todos los bloques, así como las propias operaciones de flujo de control. -
Se ha añadido un argumento
create_preds_and_succsa las funcionescircuit_to_dagdependency()ydag_to_dagdependency()que convierten deQuantumCircuityDAGCircuitrespectivamente, aDAGDependency. Cuando el valor decreate_preds_and_succses False, los predecesores y sucesores transitivos de los nodos enDAGDependencyno se construyen, haciendo las conversiones más rápidas y significativamente menos intensivas en memoria. Los predecesores y sucesores directos de los nodos deDAGDependencyse construyen como de costumbre.Por ejemplo:
from qiskit.converters import circuit_to_dagdependency from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in, create_preds_and_succs=False) -
Nuevos atributos añadidos
Clifford.symplectic_matrix,Clifford.tableau,Clifford.z,Clifford.x,Clifford.phase,Clifford.stab,Clifford.stab_z,Clifford.stab_x,Clifford.stab_phase,Clifford.destab,Clifford.destab_z,Clifford.destab_x,Clifford.destab_phasea laCliffordclase. Pueden utilizarse en lugar deClifford.table, que quedará obsoleto en el futuro.StabilizerTableyPauliTableestán pendientes de desaprobación y serán desaprobados en la próxima versión y posteriormente eliminados. -
El constructor
Commuting2qGateRoutertiene ahora una nueva palabra clave como argumento:edge_coloring. Este argumento se utiliza para proporcionar una coloración de borde del mapa de acoplamiento para determinar el orden en que se aplican las puertas de conmutación. -
Se ha añadido una nueva interfaz de algoritmos para crear algoritmos de evolución temporal utilizando las primitivas
BaseSampleryBaseEstimator. Esta nueva interfaz consta de:Esta nueva interfaz es una alternativa a la interfaz de algoritmos de evolución temporal existente anteriormente y disponible definida con
EvolutionProblem,EvolutionResult,RealEvolveryImaginaryEvolverque trabajaban con unQuantumInstanceen lugar de primitivas. Esta nueva interfaz sustituye a la anterior, que quedará obsoleta y se eliminará en futuras versiones. -
Añadidas nuevas clases de backend a
qiskit.providers.fake_provider:Estas nuevas clases implementan la interfaz
BackendV2y se crean utilizando instantáneas almacenadas de la información del backend de los sistemas IBM Quantumibm_auckland,ibm_oslo,ibm_geneva, yibm_perthrespectivamente. -
La clase
Z2Symmetriestiene dos nuevos métodosconvert_clifford()ytaper_clifford(). Estos dos métodos son las dos operaciones necesarias para estrechar un operador basándose en las simetrías Z2 del objeto y antes se realizaban internamente mediante el métodotaper()método Sin embargo, estos métodos son ahora métodos públicos de la clase que pueden ser llamados individualmente si es necesario. -
El rendimiento en tiempo de ejecución para la conjugación de un objeto largo
PauliListpor un objetoCliffordutilizando elPauliList.evolve()ha mejorado significativamente. Ahora funcionará mucho más rápido que antes. -
Añadida una nueva clase abstracta
ClassicalIOChannelal móduloqiskit.pulse.channelsmódulo. Esta clase se utiliza para representar canales de E/S clásicos y diferenciarlos de otras subclases deChannel. Esta nueva clase es la clase base para la claseMemorySlot,RegisterSlotySnapshotChannely. En consecuencia, lapad()transformación de impulsos de canonización enqiskit.pulse.transformsno introducirá retrasos en ninguna instancia deClassicalIOChannel -
El
SabreSwaptranspiler pass tiene un nuevo argumento de palabra clave en su constructor,trials. El argumentotrialsse utiliza para especificar el número de pruebas aleatorias que se intentarán. El resultado del algoritmo SABRE puede variar enormemente en función de la semilla utilizada para el número aleatorio.SabreSwapejecutará ahora el algoritmo contrialsnúmero de semillas aleatorias y elegirá la mejor (con el menor número de intercambios insertados). Si no se especificatrials, el pase utilizará por defecto el número de CPU físicas del sistema local. -
El
SabreLayouttranspiler pass tiene un nuevo argumento de palabra clave en su constructor,swap_trials. El argumentoswap_trialsse utiliza para especificar cuántas pruebas de semillas aleatorias se ejecutarán en laSabreSwappasar internamente. Corresponde altrialsarugment en elSabreSwappase. Cuando se establece, cada iteración deSabreSwapse ejecutará internamenteswap_trialsveces. Si no se especificaswap_trials, se utilizará por defecto el número de CPU físicas del sistema local. -
Se ha añadido una nueva función
estimate_observables()que utiliza una implementación de la interfazBaseEstimatorinterfaz (por ejemploEstimator,BackendEstimatoro cualquier implementación de proveedores como las presentes enqiskit-ibm-runtimeyqiskit-aer) para calcular los valores de expectativa, sus medias y desviaciones estándar a partir de una lista o diccionario de observables. Esta función cumple una función similar a la función preexistenteeval_observables()que realizaba el cálculo utilizando un objetoQuantumInstancey ha sido sustituida (y será obsoleta y posteriormente eliminada en futuras versiones) por esta nueva función. -
Se ha añadido una nueva
Operationque proporciona una interfaz abstracta y ligera para los objetos que se pueden poner en los ficherosQuantumCircuit. Esto permite almacenar objetos de "nivel superior" directamente en un circuito (por ejemplo,Cliffordobjetos), combinar directamente dichos objetos (por ejemplo, componer varios objetosCliffordobjetos consecutivos sobre los mismos qubits), y sintetizar dichos objetos en tiempo de ejecución (por ejemplo, sintetizarCliffordde forma que se optimice la profundidad y/o se aproveche la conectividad de los dispositivos). Anteriormente, sólo las subclases deqiskit.circuit.Instructionpodían incluirse enQuantumCircuitpero esta interfaz se ha vuelto difícil de manejar e incluye demasiados métodos y atributos para los objetos de uso general.La nueva
Operationincluyename,num_qubitsynum_clbits(en el futuro esto puede ajustarse ligeramente), pero lo más importante es que no incluyedefinition(y por tanto no vincula la síntesis al objeto), no incluyecondition(esto debería formar parte de un flujo de control clásico separado), y no incluyedurationyunit(ya que son propiedades de la salida del transpilador).A partir de ahora,
OperationincluyeGate,Reset,Barrier,Measurey objetos de "nivel superior" comoClifford. Esta lista de objetos de "nivel superior" crecerá en el futuro. -
A
Cliffordse añade ahora a un circuito cuántico como unOperationsin sintetizar primero un subcircuito que implemente este Clifford. La síntesis propiamente dicha se pospone a un pase de transpilación posteriorHighLevelSynthesisde transpilación.Por ejemplo, el siguiente código:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford qc = QuantumCircuit(3) cliff = random_clifford(2) qc.append(cliff, [0, 1])ya no convierte
cliffenqiskit.circuit.Instructionlo que incluye sintetizar el clifford en un circuito, cuando se anexa aqc. -
Añadido un nuevo pase de transpilador
OptimizeCliffordsque recoge bloques de objetosCliffordconsecutivos en un circuito y sustituye cada bloque por un único objetoClifford.Por ejemplo, el siguiente código:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler.passes import OptimizeCliffords from qiskit.transpiler import PassManager qc = QuantumCircuit(3) cliff1 = random_clifford(2) cliff2 = random_clifford(2) qc.append(cliff1, [2, 1]) qc.append(cliff2, [2, 1]) qc_optimized = PassManager(OptimizeCliffords()).run(qc)almacena primero los dos Cliffords
cliff1ycliff2enqccomo objetos de "nivel superior", y luego el transpiler passOptimizeCliffordsoptimiza el circuito componiendo estos dos Cliffords en un único Clifford. Tenga en cuenta que el Clifford resultante se sigue almacenando enqccomo un objeto de nivel superior. Este pase aún no está incluido en ninguno de los gestores de pases predefinidos. -
Se ha añadido un nuevo pase de transpilador
HighLevelSynthesisque sintetiza objetos de nivel superior (por ejemplo,Cliffordobjetos).Por ejemplo, el siguiente código:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler import PassManager from qiskit.transpiler.passes import HighLevelSynthesis qc = QuantumCircuit(3) qc.h(0) cliff = random_clifford(2) qc.append(cliff, [0, 1]) qc_synthesized = PassManager(HighLevelSynthesis()).run(qc)sintetizará el Clifford de nivel superior almacenado en
qcutilizando la función por defectodecompose_clifford().Este nuevo pase de transpilador
HighLevelSynthesisse integra en los gestores de pases predefinidos, ejecutándose justo después deUnitarySynthesispass. Por lo tanto,transpile()sintetizará todos los Cliffords de nivel superior presentes en el circuito.Es importante señalar que el trabajo realizado para almacenar
Cliffordcomo objetos de "nivel superior" y transpilar estos objetos utilizandoHighLevelSynthesispass debería ser completamente transparente, y no se requieren cambios en el código. -
SparsePauliOps pueden construirse ahora con matrices de coeficientes que son objetos generales de Python. Esto está pensado para su uso con objetosParameterExpressionotros objetos pueden funcionar, pero no tienen soporte de primera clase. Algunos métodos deSparsePauliOp(como la conversión a otras representaciones de clase) pueden no funcionar cuando se utilizan matricesobject, si el destino deseado no puede representar estas matrices generales.Por ejemplo, un
ParameterExpressionSparsePauliOppodría ser construido por:import numpy as np from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp print(SparsePauliOp(["II", "XZ"], np.array([Parameter("a"), Parameter("b")])))que da
SparsePauliOp(['II', 'XZ'], coeffs=[ParameterExpression(1.0*a), ParameterExpression(1.0*b)]) -
Añadida una nueva función
plot_distribution()para trazar distribuciones sobre cuasi-probabilidades. Esto es adecuado paraCounts,QuasiDistributionyProbDistribution. También se puede pasar el dict en bruto. Por ejemplo:from qiskit.visualization import plot_distribution quasi_dist = {'0': .98, '1': -.01} plot_distribution(quasi_dist) -
Se ha introducido una nueva interfaz de plugin de síntesis de alto nivel que permite utilizar técnicas de síntesis alternativas incluidas en paquetes externos sin problemas con el
HighLevelSynthesistranspilador. Estas técnicas de síntesis alternativas pueden especificarse para cualquier objeto de "nivel superior" de tipoOperationcomo, por ejemplo, paraCliffordyLinearFunction. La interfaz de este plugin es similar a la de la síntesis unitaria. En este último caso, los detalles sobre cómo escribir un nuevo plugin aparecen en laqiskit.transpiler.passes.synthesis.plugindocumentación del módulo. -
Se ha introducido una nueva clase
HLSConfigque puede utilizarse para especificar algoritmos de síntesis alternativos para objetos de "nivel superior" de tipoOperation. Para cada objeto de nivel superior de interés, un objetoHLSConfigespecifica una lista de métodos de síntesis y sus argumentos. Este objeto puede pasarse aHighLevelSynthesistranspiler pass o especificado como parámetrohls_configentranspile().Como ejemplo, supongamos que
op_ayop_bson nombres de dos objetos de nivel superior, queop_a-objetos tienen dos métodos de síntesisdefaultque no requiere ningún parámetro adicional yothercon dos parámetros enteros opcionalesoption_1yoption_2, queop_b-objetos tienen un único método de síntesisdefault, yqces un circuito cuántico que contieneop_ayop_bobjetos. El siguiente fragmento de código:hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})]) pm = PassManager([HighLevelSynthesis(hls_config=hls_config)]) transpiled_qc = pm.run(qc)muestra cómo ejecutar el método de síntesis alternativo
otherpara los objetosop_b, mientras se utilizan los métodosdefaultpara todos los demás objetos de alto nivel, incluidos los objetosop_a. -
Añadidos nuevos métodos para ejecutar primitivas
BaseSampler.run()yBaseEstimator.run(). Estos métodos se ejecutan de forma asíncrona y devuelvenJobV1que proporcionan un controlador de las ejecuciones. A estos nuevos métodos de ejecución se les pueden pasarQuantumCircuit(y observables paraBaseEstimator) que no estén registrados en el constructor. Por ejemplo:estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result()Esto proporciona una alternativa al modelo de ejecución anterior (que ahora está obsoleto) para las funciones
BaseSampleryBaseEstimatorque tomaban todas las entradas a través del constructor y llamaban al objeto primitivo con la combinación de esos parámetros de entrada para utilizarlos en la ejecución. -
Se ha añadido la opción
shotspara las implementaciones de referencia de las primitivas. Los números aleatorios pueden fijarse dando aseed_primitive. Por ejemplo:from qiskit.primitives import Sampler from qiskit import QuantumCircuit bell = QuantumCircuit(2) bell.h(0) bell.cx(0, 1) bell.measure_all() with Sampler(circuits=[bell]) as sampler: result = sampler(circuits=[0], shots=1024, seed_primitive=15) print([q.binary_probabilities() for q in result.quasi_dists]) -
Los constructores de los módulos
BaseSampleryBaseEstimatortienen un nuevo argumento opcional,options, que se utiliza para establecer los valores por defecto de las opciones expuestas a través del atributooptionsatributo. -
Se ha añadido la clase
PVQDal marco de evolución temporal enqiskit.algorithms. Esta clase implementa el algoritmo de Dinámica Cuántica Variacional proyectada (p-VQD) Barison et al..En cada paso de tiempo, este algoritmo calcula el siguiente estado con una fórmula Trotter y lo proyecta en una forma variacional. La proyección se determina maximizando la fidelidad del estado evolucionado por Trotter y el ansatz, utilizando una rutina de optimización clásica.
import numpy as np from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.algorithms.evolvers import EvolutionProblem from qiskit.algorithms.time_evolvers.pvqd import PVQD from qiskit.primitives import Estimator, Sampler from qiskit import BasicAer from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.algorithms.optimizers import L_BFGS_B sampler = Sampler() fidelity = ComputeUncompute(sampler) estimator = Estimator() hamiltonian = 0.1 * SparsePauliOp([Pauli("ZZ"), Pauli("IX"), Pauli("XI")]) observable = Pauli("ZZ") ansatz = EfficientSU2(2, reps=1) initial_parameters = np.zeros(ansatz.num_parameters) time = 1 optimizer = L_BFGS_B() # setup the algorithm pvqd = PVQD( fidelity, ansatz, initial_parameters, estimator, num_timesteps=100, optimizer=optimizer, ) # specify the evolution problem problem = EvolutionProblem( hamiltonian, time, aux_operators=[hamiltonian, observable] ) # and evolve! result = pvqd.evolve(problem) -
El método estático
QNSPSA.get_fidelity()static admite ahora un argumento opcionalsamplerque se utiliza para proporcionar una implementación de la interfazBaseSampler(comoSampler,BackendSampler, o cualquier implementación de proveedores como las presentes enqiskit-ibm-runtimeyqiskit-aer) para calcular la fidelidad de unQuantumCircuit. Por ejemplo:from qiskit.primitives import Sampler from qiskit.algorithms.optimizers import QNSPSA fidelity = QNSPSA.get_fidelity(my_circuit, Sampler()) -
Añadido un nuevo argumento de palabra clave
samplera los constructores de las clases de estimación de fase:Este argumento se utiliza para proporcionar una implementación de la interfaz
BaseSamplercomoSampler,BackendSamplero cualquier implementación de proveedores como las presentes enqiskit-ibm-runtimeyqiskit-aer.Por ejemplo:
from qiskit.primitives import Sampler from qiskit.algorithms.phase_estimators import HamiltonianPhaseEstimation from qiskit.synthesis import MatrixExponential from qiskit.quantum_info import SparsePauliOp from qiskit.opflow import PauliSumOp sampler = Sampler() num_evaluation_qubits = 6 phase_est = HamiltonianPhaseEstimation( num_evaluation_qubits=num_evaluation_qubits, sampler=sampler ) hamiltonian = PauliSumOp(SparsePauliOp.from_list([("X", 0.5), ("Y", 0.6), ("I", 0.7)])) result = phase_est.estimate( hamiltonian=hamiltonian, state_preparation=None, evolution=MatrixExponential(), bound=1.05, ) -
El
SabreSwapha mejorado significativamente el rendimiento en tiempo de ejecución gracias a la reescritura del algoritmo en Rust. -
Subclases de pulso simbólico
Gaussian,GaussianSquare,DragyConstantse han actualizado para instanciarSymbolicPulseen lugar de la propia subclase. Todos los objetos paramétricos de pulso en los programas de pulso deben ser instancias simbólicas de pulso, porque la subclase ya no es necesaria. Tenga en cuenta queSymbolicPulsepuede identificar de forma unívoca un sobre concreto con el objeto de expresión simbólica definido enSymbolicPulse.envelope. -
Añadida una nueva función,
sampled_expectation_value()que permite calcular los valores de las expectativas de los operadores diagonales a partir de distribuciones comoCountsyQuasiDistribution. Los operadores válidos para utilizar con esta función son:str,Pauli,PauliOp,PauliSumOpySparsePauliOp. -
A
SamplingVQEoptimizada para hamiltonianos diagonales y aprovecha la primitivasampler. AQAOAclase que subclaseSamplingVQE.Para utilizar la nueva
SamplingVQEcon una primitiva de referencia, se puede hacer, por ejemplo:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) sampler = Sampler() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalueNótese que los operadores auxiliares evaluados se obtienen ahora a través del campo
aux_operators_evaluatedsobre los resultados. Consistirá en una lista o dict de tuplas que contendrán los valores de expectativa de estos operadores, así como los metadatos de ejecución primitiva.aux_operator_eigenvaluesya no es un campo válido. -
Se ha añadido un nuevo argumento de palabra clave
atolal métodoSparsePauliOp.equiv()para ajustar la tolerancia de la comprobación de equivalencia, -
Se ha introducido una nueva interfaz de complemento para las etapas del transpilador que se utiliza para habilitar objetos alternativos
PassManagerobjetos de un paquete externo en una etapa concreta como parte detranspile()o laStagedPassManagersalida degenerate_preset_pass_manager(),level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()ylevel_3_pass_manager(). Los usuarios pueden seleccionar un plugin para utilizar en una etapa de transpilador con los argumentos de palabra claveinit_method,layout_method,routing_method,translation_method,optimization_method, yscheduling_methodentranspile()ygenerate_preset_pass_manager(). Puede encontrar una lista completa de los nombres de los plugins instalados actualmente con la funciónlist_stage_plugins()función. Para crear plugins, consulte la documentación del móduloqiskit.transpiler.preset_passmanagers.pluginque incluye una guía para escribir plugins de escenario. -
El
transpile()tiene dos nuevos argumentos de palabra clave,init_methodyoptimization_methodque se utilizan para especificar plugins alternativos a utilizar para las etapasinityoptimizationrespectivamente. -
La clase
PassManagerConfigtiene 2 nuevos atributos,init_methodyoptimization_methodjunto con argumentos de palabras clave coincidentes en los métodos constructores. Representan los pluginsinityoptimizationespecificados por el usuario que se utilizarán para la compilación. -
Se añade la clase
SteppableOptimizerclase se añade. Permite perfore las optimizaciones clásicas paso a paso utilizando elstep()método. Estos optimizadores implementan la interfaz "ask and tell" que (opcionalmente) permite calcular manualmente las evaluaciones de funciones o gradientes necesarias e introducirlas de nuevo en el optimizador. Para más información sobre esta interfaz, consulte: interfaz ask and tell. Un caso de uso muy sencillo en el que el usuario puede querer hacer la optimización paso a paso es para la lectura:import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): return (np.linalg.norm(x) - 1) ** 2 def grad(x): return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) for _ in range(maxiter): state = optimizer.state # Here you can manually read out anything from the optimizer state. optimizer.step() result = optimizer.create_result()Un caso más complejo sería la gestión de errores. Imagina que la función que estás evaluando tiene una probabilidad aleatoria de fallar. En este caso, puede detectar el error y volver a ejecutar la función hasta que obtenga el resultado deseado antes de continuar con el proceso de optimización. En este caso se utilizaría la interfaz preguntar y decir.
import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): if random.choice([True, False]): return None else: return (np.linalg.norm(x) - 1) ** 2 def grad(x): if random.choice([True, False]): return None else: return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) while optimizer.continue_condition(): ask_data = optimizer.ask() evaluated_gradient = None while evaluated_gradient is None: evaluated_gradient = grad(ask_data.x_center) optimizer.state.njev += 1 optmizer.state.nit += 1 cf = TellData(eval_jac=evaluated_gradient) optimizer.tell(ask_data=ask_data, tell_data=tell_data) result = optimizer.create_result()Transición de
GradientDescentpara que sea una subclase deSteppableOptimizer. -
El método
subset_fitterse añade a la claseTensoredMeasFitterclase. La aplicación se limita a patrones de mitigación en los que cada qubit se mitiga individualmente, por ejemplo[[0], [1], [2]]. Sin embargo, este es el caso más extendido. Permite que elTensoredMeasFitteren los casos en que el orden numérico de los qubits físicos no coincide con el índice del bit clásico. -
Las operaciones de flujo de control ahora se admiten a través del transpilador en los niveles de optimización 0 y 1 (por ejemplo, llamar a
transpile()ogenerate_preset_pass_manager()con el argumentooptimization_level=1). Ahora se puede construir un circuito comofrom qiskit import QuantumCircuit qc = QuantumCircuit(2, 1) qc.h(0) qc.measure(0, 0) with qc.if_test((0, True)) as else_: qc.x(1) with else_: qc.y(1)y transpilar esto con éxito, como por:
from qiskit import transpile from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") transpiled = transpile(qc, backend)Los valores disponibles para el argumento de palabra clave
layout_methodson "trivial" y "denso". Pararouting_method, están disponibles "stochastic" y "none". La traducción (translation_method) puede hacerse con "translator" o "unroller". Los niveles de optimización 2 y 3 aún no son compatibles con el flujo de control, ni tampoco lo es la programación de circuitos (es decir, proporcionar un valor ascheduling_method), aunque tenemos la intención de ampliar el soporte para estos, y los otros métodos de diseño, enrutamiento y traducción en versiones posteriores de Qiskit Terra.Para que la transpilación con operaciones de flujo de control tenga éxito con un backend, éste debe tener las operaciones de flujo de control necesarias en su base declarada. Qiskit Aer, por ejemplo, lo hace. Si simplemente desea probar este tipo de transpilaciones, considere la posibilidad de sustituir el argumento
basis_gatesportranspile(). -
Los siguientes pases del transpilador han sido todos enseñados para entender las construcciones de flujo de control en forma de
ControlFlowOpinstrucciones en un circuito:Relacionado con el diseño
ApplyLayoutDenseLayoutEnlargeWithAncillaFullAncillaAllocationSetLayoutTrivialLayoutVF2LayoutVF2PostLayout
Relacionado con el enrutamiento
Relacionado con la traducción
BasisTranslatorContainsInstructionGatesInBasisUnitarySynthesisUnroll3qOrMoreUnrollCustomDefinitionsUnroller
Relacionado con la optimización
BarrierBeforeFinalMeasurementsDepthFixedPointSizeOptimize1qGatesDecompositionCXCancellationRemoveResetInZeroState
Estos pases se utilizan sobre todo a través de los gestores de pases predefinidos (los utilizados internamente por
transpile()ygenerate_preset_pass_manager()), pero también están disponibles para otros usos. Estos pases recurrirán ahora a operaciones de flujo de control cuando proceda, actualizando o analizando los bloques internos. -
Se ha añadido una nueva
TrotterQRTEque implementa la interfazRealTimeEvolverque utiliza unqiskit.primitives.BaseEstimatorpara realizar el cálculo. Esta nueva clase sustituye a la claseqiskit.algorithms.TrotterQRTE(que será obsoleta y posteriormente eliminada en futuras versiones) que utilizaba una claseBackendoQuantumInstancepara realizar el cálculo. -
DAGCircuit.substitute_node_with_dag()ahora tomapropagate_conditioncomo argumento de palabra clave. Por defecto esTrue, que era el comportamiento anterior, y copia cualquier condición en el nodo a reemplazar en cada nodo de operación en el reemplazo. Si se establece enFalse, la condición no se copiará, lo que permite sustituir un nodo condicional por un sub-DAG que ya implemente fielmente la condición. -
DAGCircuit.substitute_node_with_dag()ahora puede tomar un mapeo para su parámetrowiresasí como una secuencia. La asignación debe asignar los bits del DAG de sustitución a los bits del DAG en el que se inserta. Esto permite un estilo de construcción más fácil para los llamadores cuando el nodo de entrada tiene tanto bits clásicos como una condición, y el DAG de reemplazo puede usarlos fuera de orden. -
Se ha añadido el paquete
qiskit.algorithms.minimum_eigensolverspara incluir interfaces para algoritmos con primitivas.VQEse ha refactorizado en esta implementación para aprovechar las primitivas.Para utilizar la nueva implementación con una primitiva de referencia, se puede hacer, por ejemplo:
from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp h2_op = SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], ) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() vqe = VQE(estimator, ansatz, optimizer) result = vqe.compute_minimum_eigenvalue(h2_op) eigenvalue = result.eigenvalueNótese que los operadores auxiliares evaluados se obtienen ahora a través del campo
aux_operators_evaluatedsobre los resultados. Consistirá en una lista o dict de tuplas que contendrán los valores de expectativa de estos operadores, así como los metadatos de ejecución primitiva.aux_operator_eigenvaluesya no es un campo válido.
Notas de actualización
-
Para
Targetque sólo contienen operaciones de 2 qubits definidas globalmente sin ningún tipo de conectividad, el resultado del métodoTarget.build_coupling_map()devolveráNoneen lugar de un objetoCouplingMapque contienenum_qubitsnodos y ninguna arista. Este cambio se realizó para reflejar mejor las restricciones de conectividad reales delTargetporque en este caso no hay restricciones de conectividad en el backend modelado por el modeloTargety no una falta de conectividad. Si por alguna razón desea el comportamiento anterior, puede reproducirlo comprobando si hay un retornoNoney construyendo manualmente un mapa de acoplamiento, por ejemplo:from qiskit.transpiler import Target, CouplingMap from qiskit.circuit.library import CXGate target = Target(num_qubits=3) target.add_instruction(CXGate()) cmap = target.build_coupling_map() if cmap is None: cmap = CouplingMap() for i in range(target.num_qubits): cmap.add_physical_qubit(i) -
El valor por defecto para el argumento de la palabra clave
entanglementen el constructor de los objetosRealAmplitudesyEfficientSU2ha cambiado de"full"a"reverse_linear". Este cambio se hizo porque el circuito de salida es equivalente pero utiliza sólo en lugar deCXGatepuertas. Si desea el valor predeterminado anterior, puede establecer explícitamenteentanglement="full"al llamar a cualquiera de los constructores. -
Se ha añadido una comprobación de validación a
BaseSampler.run(). Genera un error si no hay bit clásico. -
Se ha mejorado el comportamiento de la
call()se ha mejorado. Cuando una instanciaScheduleBlockinstancia es llamada por este método, éste crea internamente unaReferenceen el contexto actual, e inmediatamente asigna el programa llamado a la referencia. Por lo tanto, la instrucciónCallinstrucción ya no se genera. Junto con este cambio, se prohíbe llamar a diferentes bloques con el mismo argumentoname. Dicha operación dará lugar a un error. -
Para la mayoría de las arquitecturas a partir de la siguiente versión de Qiskit Terra, 0.23, el paquete
tweedledumse convertirá en una dependencia opcional, en lugar de un requisito. Esto lo utilizan actualmente algunas funciones clásicas de oráculo de fase. Si su aplicación o biblioteca necesita esta funcionalidad, puede prepararse añadiendo inmediatamentetweedleduma las dependencias de su paquete.tweedledumya no es un requisito en macOS arm64 ( M1 ) con efecto inmediato en Qiskit Terra 0.22. Esto se debe a que las ruedas proporcionadas para esta plataforma están rotas, y la construcción desde el sdist no es fiable para la mayoría de la gente. Si instala manualmente una versión operativa detweedledum, toda la funcionalidad dependiente seguirá funcionando. -
El atributo
._layoutdel objetoQuantumCircuitha pasado de almacenar un objetoLayouta almacenar una clase de datos con 2 atributos,initial_layoutque contiene un objetoLayoutpara la disposición inicial establecida durante la compilación yinput_qubit_mappingque contiene un diccionario que asigna qubits a índices de posición en el circuito original. Este cambio era necesario para proporcionar toda la información para que un circuito post-transpilado sea capaz de invertir completamente la permutación causada por el trazado inicial en todas las situaciones. Aunque este atributo es privado y no debe ser utilizado externamente, es la única manera de rastrear el diseño inicial a través detranspile()por lo que el cambio se documenta en caso de que confíes en él. Si tienes algún caso de uso para el atributo_layoutque no esté contemplado en la API de Qiskit, abre una incidencia para que podamos solucionar esta carencia. -
Los constructores para
SetPhase,ShiftPhase,SetFrequencyyShiftFrequencylanzarán un errorPulseErrorsi el valor introducido mediante el argumentochannelno es una instancia dePulseChannel. Este cambio se ha realizado para validar que la entrada a los constructores es válida, ya que las instrucciones sólo son válidas para canales de impulsos y no para otros tipos de canales. -
La función
plot_histogram()ha sido modificada para devolver un histograma real de valores discretos. El comportamiento anterior de la función era, a pesar del nombre, generar realmente una visualización de la distribución de la entrada. Debido a esta disparidad entre el nombre de la función y el comportamiento, el comportamiento de la función se ha cambiado para que ahora genere un histograma adecuado de datos discretos. Si desea conservar el comportamiento anterior de trazar una distribución de probabilidad de los datos de recuento, puede aprovechar la funciónplot_distribution()para generar un gráfico equivalente. Por ejemplo, el comportamiento anterior deplot_histogram({'00': 512, '11': 500})se puede recrear con:from qiskit.visualization import plot_distribution import matplotlib.pyplot as plt ax = plt.subplot() plot_distribution({'00': 512, '11': 500}, ax=ax) ax.set_ylabel('Probabilities') -
Se han eliminado los contextos
qiskit.pulse.builderinlineypad. Se eliminaron por primera vez en Terra 0.18.0 (julio de 2021). No hay reemplazo parainline; uno puede simplemente escribir los pulsos en el ámbito de aplicación que contiene. El gestor de contextospadno tiene ningún efecto desde que fue obsoleto. -
La salida del
SabreSwaptranspiler pass (incluyendo cuandooptimization_level=3orouting_methodolayout_methodse establecen en'sabre'al llamar atranspile()) con un valor de semilla fijo puede cambiar con respecto a versiones anteriores. Esto es causado por un nuevo generador de números aleatorios que se utiliza como parte de la reescritura de laSabreSwapen Rust, lo que ha mejorado significativamente el rendimiento. Si confías en tener una salida consistente puedes ejecutar el pase en una versión anterior de Qiskit y aprovecharqiskit.qpypara guardar el circuito y luego cargarlo utilizando la versión actual. -
El comportamiento de
Layout.add()cuando no se especificaphysical_bitha cambiado con respecto a versiones anteriores. En versiones anteriores, se añadía un nuevo bit físico en función de la longitud delLayoutobjeto. Por ejemplo, si tuviera unLayoutcon los bits físicos 1 y 3, las sucesivas llamadas aadd()añadiría los bits físicos 2, 4, 5, 6, etc. Si los bits físicos fueran 2 y 3, las llamadas sucesivas sumarían 4, 5, 6, 7, etc. Esto ha cambiado para que en su lugarLayout.add()añadirá primero los bits físicos que falten entre 0 y el bit físico máximo contenido en el archivoLayout. Así que para el ejemplo 1 y 3 ahora añade 0, 2, 4, 5 y para el ejemplo 2 y 3 añade 0, 1, 4, 5 alLayout. Este cambio se hizo tanto para aumentar la previsibilidad del resultado, como para corregir una clase de errores causados por el comportamiento inesperado. Como los bits físicos en un backend siempre son secuencias contiguas de 0 a añadir nuevos bits cuando todavía hay bits físicos sin usar podría potencialmente causar que el diseño utilice más bits de los disponibles en el backend. Si desea el comportamiento anterior, puede especificar manualmente el bit físico deseado al llamar aLayout.add(). -
El método obsoleto
SparsePauliOp.tableatributo ha sido eliminado. Originalmente estaba obsoleto en Qiskit Terra 0.19. En su lugar, debe utilizarse el métodopaulis(). -
Se ha eliminado la posibilidad de devolver un
PauliTabledesde la funciónpauli_basis()se ha eliminado. Del mismo modo, el argumentopauli_listde la funciónpauli_basis()que se utilizaba para cambiar a unPauliList(ahora el único tipo de retorno). Esta funcionalidad quedó obsoleta en la versión de Qiskit Terra 0.19. -
Los objetos backend falsos
FakeJohannesburg,FakeJohannesburgV2,FakeAlmaden,FakeAlmadenV2,FakeSingaporeyFakeSingaporeV2ya no contienen las cargas útiles por defecto del pulso. Esto significa para lasBackendV1el métodoBackendV1.defaults()y la simulación de impulsos medianteBackendV1.run()ya no está disponible. Para las clases basadas enBackendV2la propiedadcalibrationpara instrucciones en la claseTargetya no se rellena. Este cambio se realizó porque estos sistemas tenían cargas útiles de impulsos predeterminados excesivamente grandes (en total ~50MB ) debido al uso de formas de onda muestreadas en lugar de definiciones de impulsos paramétricas. Estos tres archivos de carga útil ocuparon más del 50% del espacio en disco necesario para instalar qiskit-terra. Si se compara con el valor potencial de poder compilar con conocimiento de pulso o simular con pulso estos dispositivos retirados, el tamaño del archivo no merece la pena. Si necesitas aprovechar estas propiedades puedes aprovechar una versión anterior de Qiskit y aprovecharqpypara transferir circuitos de versiones anteriores de qiskit a la versión actual. -
isinstancecomprobar con clases de pulsoGaussian,GaussianSquare,DragyConstantse invalidará porque estas subclases de pulsos ya no se instancian. Seguirán funcionando en Terra 0.22, pero debe comenzar la transición inmediatamente. En lugar de utilizar información de tipo, debería utilizarseSymbolicPulse.pulse_type. Se supone que es un identificador de cadena único para las envolventes de pulso, y podemos utilizar la igualdad de cadenas para investigar los tipos de pulso. Por ejemplo:from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if isinstance(pulse, Gaussian): print("This is Gaussian pulse.")Este código debe actualizarse a
from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if pulse.pulse_type == "Gaussian": print("This is Gaussian pulse.")Por la misma razón, no se debe acceder a los atributos de clase como
pulse.__class__.__name__para obtener información sobre el tipo de pulso. -
La excepción
qiskit.exceptions.QiskitIndexErrorha sido eliminada y ya no existe según el aviso de depreciación de qiskit-terra 0.18.0 (publicado el 12 de julio de 2021). -
Se han eliminado los argumentos obsoletos
epsilonyfactrdel constructor de la claseL_BFGS_Bse han eliminado. Estos argumentos quedaron obsoletos en la versión 0.18.0 (publicada el 12 de julio de 2021). En su lugar se debe utilizar el argumentoftol, puede consultar la documentación de scipy sobre el optimizador para obtener más detalles sobre la relación entre estos argumentos. -
Los gestores de paso preestablecidos para los niveles 1 y 2, que se utilizarán cuando
optimization_level=1ooptimization_level=2contranspile()ogenerate_preset_pass_manager()y la salida delevel_1_pass_manager()ylevel_2_pass_manager()utilizarán ahoraSabreLayoutySabreSwappor defecto en lugar de los anterioresDenseLayoutyStochasticSwap. Este cambio se hizo para mejorar la calidad de salida del transpilador, la combinación deSabreLayoutySabreSwapsuele dar lugar a que se inserten menosSwapGateobjetos insertados en el circuito de salida. Si desea utilizar los pases anteriores por defecto puede configurarlayout_method='dense'yrouting_method='stochastic'entranspile()ogenerate_preset_pass_manager()para aprovecharDenseLayoutyStochasticSwaprespectivamente. -
Se ha desactivado el uso implícito de
approximation_degree!=1.0por defecto en la funcióntranspile()cuando se estableceoptimization_level=3. El transpilador debería, por defecto, preservar la unitaridad de la entrada hasta transformaciones conocidas como permutaciones unilaterales y transformaciones de similitud. Esto se rompió por el uso previo deapproximation_degree=Noneque conducía a resultados incorrectos en casos como la evolución Trotterizada con muchos pasos de tiempo donde los unitarios estaban siendo excesivamente aproximados conduciendo a resultados incorrectos. Se decidió que las transformaciones que rompen la equivalencia unitaria deben ser activadas explícitamente por el usuario. Si desea el comportamiento predeterminado anterior, en el que las instruccionesUnitaryGatesintetizadas se aproximan a las tasas de error de las instrucciones nativas del backend de destino, puede definir explícitamenteapproximation_degree=Noneal llamar atranspile()conoptimization_level=3, por ejemplo:transpile(circuit, backend, approximation_degree=None, optimization_level=3) -
Cambie el valor por defecto del número máximo de evaluaciones de función permitidas (
maxfun) enL_BFGS_Bde 1000 a 15000 para que coincida con el valor predeterminado de SciPy. Este número también coincide con el número de iteraciones por defecto (maxiter). -
Actualizado
ProbDistributionyQuasiDistributionpara almacenar la información del número de bits si se dan cadenas de bits sin prefijo “0b”.ProbDistribution.binary_probabilities()yQuasiDistribution.binary_probabilities()utilizar el número de bits almacenado como valor por defecto del número de bits. -
RZXCalibrationBuilderyRZXCalibrationBuilderNoEchose han actualizado para omitir las puertas CX de estiramiento implementadas por secuencia de resonancia cruzada sin eco (ECR) para evitar la terminación del paso con errores inesperados. Estos pases toman un nuevo argumentoverboseque controla si los pases avisan cuando esto ocurre. Siverbose=Trueestá configurado, pass emite una advertencia al usuario cuando detecta una secuencia no ECR. -
El módulo de visualización
qiskit.visualizationha experimentado una reorganización interna. Esto no debería haber afectado a la interfaz pública, pero si estabas accediendo a alguna parte interna de los cajones del circuito, puede que ahora estén en lugares diferentes. Las únicas partes del módulo de visualización que se consideran públicas son los componentes que se documentan en esta documentación en línea.
Notas sobre características en desuso
-
Importar los nombres
Int1,Int2,classical_functionyBooleanExpressiondirectamente deqiskit.circuitestá obsoleta. Esto forma parte del movimiento para hacer detweedledumuna dependencia opcional en lugar de un requisito completo. En su lugar, debe importar estos nombres desdeqiskit.circuit.classicalfunction. -
Los módulos
qiskit.algorithms.factorizersyqiskit.algorithms.linear_solversestán obsoletos y se eliminarán en una futura versión. Se sustituyen por tutoriales en el libro de texto Qiskit: Shor HHL -
La dirección
random_stabilizer_table()ha quedado obsoleta y se eliminará en una próxima versión. En su lugar, debe utilizarse la funciónrandom_pauli_list(). -
La función del módulo de impulsos
qiskit.pulse.utils.deprecated_functionalityestá obsoleta y se eliminará en una futura versión. Se trataba de una función principalmente interna. La misma funcionalidad la proporcionaqiskit.utils.deprecate_function, que debería utilizarse en su lugar. -
Se ha modificado el método de ejecución de las primitivas. Los métodos
BaseSampler.__call__()yBaseEstimator.__call__()han quedado obsoletos. Por ejemplo:estimator = Estimator(...) result = estimator(circuits, observables, parameters) sampler = Sampler(...) result = sampler(circuits, observables, parameters)debe reescribirse como
estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result() sampler = Sampler() result = sampler.run(circuits, parameter_values).result()El uso de primitivas como gestores de contexto está obsoleto. No todas las primitivas disponen de un gestor de contexto. Cuando está disponible (por ejemplo, en
qiskit-ibm-runtime), el gestor de contexto de la sesión proporciona una funcionalidad equivalente.circuitsobservablesy en el constructor ha quedado obsoleto.parameterscircuitsyobservablespueden pasarse desde los métodosrun.runno admitenparameters. Los usuarios deben recurrir a los valores de los parámetros por sí mismos. -
El argumento no utilizado
qubit_channel_mappingen elRZXCalibrationBuilderyRZXCalibrationBuilderNoEchohan quedado obsoletos y se eliminarán en una futura versión. Este argumento ya no se utiliza y no tiene ningún efecto sobre el funcionamiento de los pases.
Corrección de errores
-
Se ha solucionado un problema por el que
Pauli.evolve()yPauliList.evolve()provocaba un error de tipo al evolucionar por ciertas puertas Clifford que modificaban la fase de Pauli. Corregido #8438 -
Se ha corregido un error en
QuantumCircuit.initialize()yQuantumCircuit.prepare_state()que provocaba que no aceptaran un únicoQubitcomo argumento para inicializar. -
El método
QuantumCircuit.while_loop()resolverá ahora las referencias clásicas a bits en su condición de la misma forma queQuantumCircuit.if_test()yInstructionSet.c_if()lo hacen. -
Los métodos
DAGCircuitmétodosdepth(),size()yDAGCircuit.count_ops()antes devolvían silenciosamente resultados que tenían poco o ningún significado si el flujo de control estaba presente en el circuito. Endepth()ysize()lanzarán ahora correctamente un error en estos casos, pero tienen un nuevo argumento de palabra claverecursepara permitir el cálculo de un valor proxy, mientras que los métodoscount_ops()recurrirá por defecto a los bloques y contará las operaciones dentro de ellos. -
Se ha corregido un problema en el
DenseLayouttranspilador, por el que cualquier objetoQubitsueltos (es decir, que no formaban parte de un objetoQuantumRegister) que formaban parte deQuantumCircuitno se incluían en la salidaLayoutgenerada por el pase. -
El método constructor
Operator.from_circuit()ha sido actualizado para que pueda manejar la salida de diseño detranspile()e invierta correctamente la permutación de qubits causada por la disposición en todos los casos. Antes, si su circuito transpilado utilizaba objetos sueltosQubitobjetos, variosQuantumRegistero un único objetoQuantumRegistercon un nombre distinto de"q"el constructor habría fallado al crear unOperatordel circuito. Corregido #8800. -
Se ha corregido un error por el que fallaba la descomposición de una instrucción con un qubit y un bit clásico que contenía una única puerta cuántica. Ahora lo siguiente se descompone como se esperaba:
block = QuantumCircuit(1, 1) block.h(0) circuit = QuantumCircuit(1, 1) circuit.append(block, [0], [0]) decomposed = circuit.decompose() -
Corregida la inicialización de la matriz simpléctica vacía en
from_symplectic()enPauliListpor ejemplo:from qiskit.quantum_info.operators import PauliList x = np.array([], dtype=bool).reshape((1,0)) z = np.array([], dtype=bool).reshape((1,0)) pauli_list = PauliList.from_symplectic(x, z) -
Solucionar un problema en el
GateDirectionpara el archivoCZGate. La puerta CZ es simétrica, por lo que se permite voltear los argumentos de los qubits para que coincidan con el mapa de acoplamiento dirigido. -
Se han solucionado problemas con el método
DerivativeBase.gradient_wrapper()cuando se reutiliza un muestreador de circuitos entre las llamadas y se vinculan parámetros anidados. -
Se ha solucionado un problema en los cajones de los circuitos
mplylatex, cuando al establecer la opciónidle_wiresen Falso cuando había unbarrieren el circuito provocaba el fallo de los cajones. Corregido #8313 -
Se ha corregido un problema en
circuit_drawer()yQuantumCircuit.draw()con el métodolatexpor el que se producía un errorOSErroren sistemas cuyos directorios temporales (por ejemplo,/tmp) se encuentran en un sistema de archivos diferente del directorio de trabajo. Correcciones #8542 -
Anidar un
FlowControllerdentro de otro en unPassManagerantes podía hacer que algunos pases del transpilador se "olvidaran" durante la transpilación, si los pases devolvían un nuevoDAGCircuiten lugar de mutar su entrada. Los sitiosFlowControllerafectarán ahora correctamente a la transpilación. -
Comparando
QuantumCircuityDAGCircuits para la igualdad era previamente no determinista si los circuitos contenían más de un registro del mismo tipo (por ejemplo, dos o másQuantumRegisters), devolviendo a vecesFalseincluso si los registros eran idénticos. Ahora comparará correctamente circuitos con múltiples registros. -
El exportador OpenQASM 2 (
QuantumCircuit.qasm()) definirá ahora correctamente los parámetros de los qubits para las operacionesUnitaryGateque no afectan a todos los qubits sobre los que se definen. Corregido #8224. -
Se han corregido dos errores en el cajón del circuito
text. Estos aparecían cuandovertical_compressionestaba configurado comomedium, que es el valor por defecto. El primero a veces hacía que el texto sobrescribiera otro texto o puertas, y el segundo a veces hacía que se rompieran las conexiones entre una puerta y sus controles. Ver #8588. -
Se ha solucionado un problema con el
UnitarySynthesispor el que un circuito con puertas de 1 qubit y una entradaTargetfallaba a veces en lugar de procesar el circuito como se esperaba. -
El transpilador
GateDirectionrespetará los valores disponibles para los parámetros de las puertas cuando se manipulen puertas parametrizadas con un parámetroTarget. -
Se ha corregido un problema en la clase
SNOBFITcuando se producía un error interno durante la ejecución del métodominimize()si no se especificaban límites de entrada. Esto se comprueba ahora en el momento de la llamada para que aparezca rápidamente unValueErrorsi faltan los límites requeridos en laminimize()llamada. Correcciones #8580 -
Se ha corregido un problema en la llamada de salida del método
get_energy_evaluation()de la claseVQDahora llamará correctamente alcallbackespecificado cuando se ejecute. Anteriormente, la llamada de retorno no se utilizaba correctamente en este caso. Corregido #8575 -
Se ha solucionado un problema cuando se utilizaba
circuit_drawer()conreverse_bits=Trueen un circuito sin bits clásicos que provocaba la emisión de una advertencia potencialmente confusa sobrecregbundle. Corregido #8690 -
El exportador OpenQASM 3 (
qiskit.qasm3) tratará ahora correctamente los módulos integrados de OpenQASM (comoresetymeasure) que tengan una condición clásica aplicada porc_if(). Antes se habría ignorado esta condición. -
Se ha solucionado un problema con la clase
SPSAque internamente intentaba agrupar los trabajos en lotes de tamaño uniforme, lo que provocaba una excepción si no era posible crear lotes uniformes. Esto se ha corregido para que siempre se procesen correctamente los trabajos por lotes aunque no tengan el mismo tamaño. -
Se ha corregido el comportamiento de
Layout.add()que podía provocar que la salida detranspile()no fuera válida y contuviera más Qubits de los disponibles en el backend de destino. Arreglado: #8667 -
Se ha corregido un problema con la función
state_to_latex(): si se pasaba una cadena de texto látex al argumento opcionalprefixde la función, se producía un error. Corregido #8460 -
La función
state_to_latex()no producía LaTeX válida en presencia de valores cercanos a cero, lo que provocaba errores cuando se llamaba astate_drawer(). Corregido #8169. -
GradientDescentahora contará correctamente el número de iteraciones, evaluaciones de función y evaluaciones de gradiente. Además, la documentación indica ahora correctamente que el gradiente se aproxima mediante un método de diferencias finitas hacia delante. -
Corrección de advertencias de desaprobación en
NaturalGradientque ahora utilizaStandardScalerpara escalar los datos antes de ajustar el modelo si el parámetronormalizese establece enTrue.
Aer 0.11.0
No cambia
IBM Proveedor Q 0.19.2
No cambia