Notas de la versión de Qiskit 0.18
0.18.3
Terra 0.13.0
Sin cambios
Aer 0.5.1
Notas de actualización
- Cambia el modo en que se gestionan los pases de transpilación en las clases Controlador de C++, de modo que cada pase debe llamarse explícitamente. Esto permite una mayor personalización sobre cuándo se debe llamar a cada pase y con qué parámetros. En particular, esto permite establecer diferentes parámetros para el paso de optimización de la fusión de puertas en función del método de simulación QasmController.
- Añadir
gate_length_unitskwarg aqiskit.providers.aer.noise.NoiseModel.from_device()para especificargate_lengthspersonalizado en la función de modelo de ruido del dispositivo para manejar las conversiones de unidades para el código interno. - Añade la puerta Y controlada ("cy") al conjunto de puertas compatibles con los métodos del simulador Estabilizador.
- Para el backend de Aer, la validación jsonschema de los objetos qobj de entrada de terra es ahora opcional en lugar de estar activada por defecto. Si desea habilitar la validación jsonschema de qobj establezca el kwarg
validateen el métodoqiskit.providers.aer.QasmSimualtor.run()para el objeto backend aTrue.
Corrección de errores
-
Eliminar "extended_stabilizer" de los métodos de simulación seleccionados automáticamente. Esto es necesario ya que el método del estabilizador extendido no es exacto y puede dar resultados incorrectos para ciertos circuitos a menos que el usuario sepa cómo optimizar sus parámetros de configuración.
El método automático ahora sólo selecciona entre los métodos "estabilizador", "matriz_densidad" y "vector_estado". Si se ejecuta un circuito que no sea Clifford y que sea demasiado grande para el método statevector, se lanzará una excepción sugiriendo que intente utilizar explícitamente los métodos "extended_stabilizer" o "matrix\product_state" en su lugar.
-
Corrige las clases Controlador para que se aplique primero el pase de transpilación ReduceBarrier. Esto evita que las instrucciones de barrera impidan el truncamiento de los qubits no utilizados si la única instrucción definida sobre ellos era una barrera.
-
Desactiva la fusión de puertas para el método de simulación del estado del producto matricial, ya que estaba causando problemas con resultados incorrectos en algunos casos.
-
Corrección de error en la conversión de unidades de tiempo de puerta para el modelo de ruido de dispositivo con errores de relajación térmica y errores de puerta. La probabilidad de error de despolarización se calculaba con el tiempo de puerta en microsegundos, mientras que para la relajación térmica se calculaba en nanosegundos. Esto hizo que no se aplicara ningún error de despolarización, ya que las unidades incorrectas harían que el dispositivo pareciera estar limitado por la coherencia.
-
Corrección de error en la composición incorrecta de QuantumErrors cuando los qubits de las instrucciones compuestas difieren.
-
Se soluciona un problema por el que se comprobaba que la puerta "diagonal" era unitaria con una tolerancia demasiado alta. Esto provocaba que las diagonales generadas a partir de funciones Numpy no pasaran a menudo la prueba.
-
Arreglar el paso de optimización del circuito remove-barrier para que se aplique antes de la trucación de qubits. Esto soluciona un problema por el que las barreras insertadas por el transpilador Terra a través de qubits inactivos impedían que se truncaran.
Ignis 0.3.0
Sin cambios
Aqua 0.6.6
Sin cambios
IBM Proveedor Q 0.6.1
Sin cambios
0.18.0
Terra 0.13.0
Preludio
La versión 0.13.0 incluye muchos cambios importantes. Algunas de las novedades más destacadas son:
Para el transpilador hemos cambiado la librería de grafos utilizada para construir la clase qiskit.dagcircuit.DAGCircuit que es la estructura de datos subyacente detrás de todas las operaciones para basarse en retworkx para mejorar considerablemente el rendimiento. La velocidad de transpilación de circuitos en la versión 0.13.0 debería ser significativamente más rápida que en versiones anteriores.
Se ha simplificado considerablemente el estilo de construcción de las instrucciones Pulse. Ahora, Command s está obsoleto y se admite un conjunto unificado de Instruction s.
El módulo qiskit.quantum_info incluye varias funciones nuevas para generar operadores aleatorios (como Cliffords y canales cuánticos) y para calcular la norma diamante de los canales cuánticos; actualizaciones de los módulos Statevector y DensityMatrix para calcular probabilidades de medida y medidas de muestreo; y varias clases nuevas basadas en la representación simpléctica de las matrices de Pauli. Estas nuevas clases incluyen los operadores Clifford (Clifford), matrices de N-qubit que son dispersas en la base de Pauli (SparsePauliOp), listas de Pauli (PauliTable) y listas de estabilizadores (StabilizerTable).
En esta versión también se ha mejorado considerablemente la documentación de Qiskit, incluida la documentación de los módulos qiskit.circuit, qiskit.pulse y qiskit.quantum_info y.
Además, se han actualizado los nombres de los QuantumCircuit para que sean más coherentes. Como consecuencia, varias clases y métodos han quedado obsoletos a medida que se adopta un esquema de nomenclatura más coherente.
Para más información sobre los cambios introducidos en esta versión, consulte las notas de la versión.
Nuevas funciones
-
Añadido un nuevo módulo de biblioteca de circuitos
qiskit.circuit.library. Este será un lugar para los constructores de circuitos de uso común que se pueden utilizar como bloques de construcción para circuitos o aplicaciones más grandes. -
La clase
qiskit.providers.BaseJobtiene cuatro nuevos métodos:done()running()cancelled()in_final_state()
Estos métodos se utilizan para comprobar si un trabajo se encuentra en un estado determinado.
-
Añade la capacidad de especificar el control condicionado a que un qubit esté en estado de masa. El estado de los qubits de control se representa mediante un número entero. Por ejemplo:
from qiskit import QuantumCircuit from qiskit.extensions.standard import XGate qc = QuantumCircuit(4) cgate = XGate().control(3, ctrl_state=6) qc.append(cgate, [0, 1, 2, 3])Crea una puerta de cuatro qubits en la que el cuarto qubit se voltea si el primer qubit está en el estado de tierra y el segundo y tercer qubits están en el estado excitado. Si
ctrl_stateesNone, por defecto, el control está condicionado a que todos los qubits de control estén excitados. -
Un nuevo widget jupyter,
%circuit_library_infoha sido añadido aqiskit.tools.jupyter. Este widget se utiliza para visualizar detalles sobre circuitos construidos a partir de la biblioteca de circuitos. Por ejemplofrom qiskit.circuit.library import XOR import qiskit.tools.jupyter circuit = XOR(5, seed=42) %circuit_library_info circuit -
Una nueva opción kwarg,
formatted, ha sido añadida aqiskit.circuit.QuantumCircuit.qasm(). Cuando se establece enTrueel método imprimirá una versión de sintaxis resaltada (usando pygments) a stdout y devolveráNone(que difiere del comportamiento normal de devolver el código QASM como una cadena). -
Una nueva opción kwarg,
filename, ha sido añadida aqiskit.circuit.QuantumCircuit.qasm(). Cuando se establece en una ruta, el método escribirá el código QASM en ese archivo. A continuación, seguirá emitiendo con normalidad. -
Una nueva instrucción
SetFrequencyque permite a los usuarios cambiar la frecuencia de laPulseChannel. Esto se hace de la siguiente manera:from qiskit.pulse import Schedule from qiskit.pulse import SetFrequency sched = pulse.Schedule() sched += SetFrequency(5.5e9, DriveChannel(0))En este ejemplo, la frecuencia de todos los pulsos antes del comando
SetFrequencyserá la frecuencia por defecto y todos los pulsos aplicados al canal de accionamiento cero después del comandoSetFrequencyserán a 5.5 GHz. Los usuarios deSetFrequencydeben tener en cuenta las posibles limitaciones de hardware. -
Se ha añadido un nuevo método
assign_parameters()a la claseqiskit.circuit.QuantumCircuitclase. Este método acepta un diccionario de parámetros con objetos flotantes y Parámetros en un único diccionario. En otras palabras, este nuevo método le permite vincular flotantes, parámetros o ambos en un único diccionario.Además, mediante el uso de la
inplacekwarg se puede especificar opcionalmente puede modificar el circuito original en su lugar. Por defecto está configurado comoFalsey el método devolverá una copia del circuito original. -
Se ha añadido un nuevo método
num_nonlocal_gates()a la claseqiskit.circuit.QuantumCircuitclase. Este método devuelve el número de puertas de un circuito en el que intervienen 2 o más qubits. La aplicación de estas puertas es más costosa en términos de tiempo y errores. -
El método
qiskit.circuit.QuantumCircuitmétodoiso()para añadir una puertaIsometryal circuito tiene un nuevo alias. Ahora puede llamar aqiskit.circuit.QuantumCircuit.isometry()además de llamar aiso. -
Se ha añadido un atributo
descriptiona la claseCouplingMappara almacenar una breve descripción de los distintos mapas de acoplamiento (por ejemplo, completo, cuadriculado, lineal, etc.). -
Se ha añadido un nuevo método
compose()a la claseDAGCircuitpara componer dos circuitos a través de sus DAG.dag_left.compose(dag_right, edge_map={right_qubit0: self.left_qubit1, right_qubit1: self.left_qubit4, right_clbit0: self.left_clbit1, right_clbit1: self.left_clbit0})┌───┐ ┌─────┐┌─┐ lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├┤M├ ├───┤ ┌─┴─┐└─┬─┬─┘└╥┘ lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├──┤M├───╫─ ┌──┴───┴──┐ └───┘ └╥┘ ║ lqr_1_2: ┤ U1(0.1) ├ + rcr_0: ════════╬════╩═ = └─────────┘ ║ lqr_2_0: ─────■───── rcr_1: ════════╩══════ ┌─┴─┐ lqr_2_1: ───┤ X ├─── └───┘ lcr_0: ═══════════ lcr_1: ═══════════ ┌───┐ lqr_1_0: ───┤ H ├────────────────── ├───┤ ┌─────┐┌─┐ lqr_1_1: ───┤ X ├─────■──┤ Tdg ├┤M├ ┌──┴───┴──┐ │ └─────┘└╥┘ lqr_1_2: ┤ U1(0.1) ├──┼──────────╫─ └─────────┘ │ ║ lqr_2_0: ─────■───────┼──────────╫─ ┌─┴─┐ ┌─┴─┐ ┌─┐ ║ lqr_2_1: ───┤ X ├───┤ X ├──┤M├───╫─ └───┘ └───┘ └╥┘ ║ lcr_0: ═══════════════════╩════╬═ ║ lcr_1: ════════════════════════╩═ -
Los backends simulados en
qiskit.test.mockahora tienen un método funcionalrun()que devolverá resultados similares a los dispositivos reales. Siqiskit-aerestá instalado, se ejecutará una simulación con un modelo de ruido construido a partir de la instantánea del dispositivo en el falso backend. En caso contrario,qiskit.providers.basicaer.QasmSimulatorPyse utilizará para realizar una simulación ideal. Además, si se pasa un experimento de pulsos aruny qiskit-aer está instalado, se utilizaráPulseSimulatorpara simular los horarios de pulsos. -
El método
qiskit.result.Result()métodoget_counts()devolverá ahora una lista de todos los recuentos disponibles cuando haya varios circuitos en un trabajo. Esto funciona cuando se llama aget_counts()sin argumentos.La principal consideración para esta función era dibujar todos los resultados de múltiples circuitos en el mismo histograma. Por ejemplo, ahora es posible hacer algo así:
from qiskit import execute from qiskit import QuantumCircuit from qiskit.providers.basicaer import BasicAer from qiskit.visualization import plot_histogram sim = BasicAer.get_backend('qasm_simulator') qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() result = execute([qc, qc, qc], sim).result() plot_histogram(result.get_counts()) -
Se ha añadido un nuevo kwarg,
initial_state, a la funciónqiskit.visualization.circuit_drawer()y al métodoQuantumCircuitmétododraw(). Si se establece enTrue, el estado inicial se incluirá en las visualizaciones de circuitos para todos los backends. Por ejemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Ahora es posible insertar un callable en un fichero
qiskit.pulse.InstructionScheduleMapque devuelve un nuevoqiskit.pulse.Schedulecuando se llama con parámetros. Por ejemplo:def test_func(x): sched = Schedule() sched += pulse_lib.constant(int(x), amp_test)(DriveChannel(0)) return sched inst_map = InstructionScheduleMap() inst_map.add('f', (0,), test_func) output_sched = inst_map.get('f', (0,), 10) assert output_sched.duration == 10 -
Dos nuevas clases de puertas,
qiskit.extensions.iSwapGateyqiskit.extensions.DCXGate, junto con susQuantumCircuitmétodosiswap()ydcx()se han añadido a las extensiones estándar. Estas puertas, que son localmente equivalentes entre sí, pueden utilizarse para ejecutar interacciones XY concretas. Una breve motivación de estas puertas puede encontrarse en: arxiv.org/abs/quant-ph/0209035 -
La clase
qiskit.providers.BaseJobtiene ahora un nuevo métodowait_for_final_state()que sondea el estado del trabajo hasta que éste alcanza un estado final (comoDONEoERROR). Este método también toma uncallbackkwarg opcional que toma un Python callable que será llamado durante cada iteración del bucle de sondeo. -
Los atributos
search_widthysearch_depthdelqiskit.transpiler.passes.LookaheadSwappass son ahora configurables al inicializar el pass. Un espacio de búsqueda más amplio puede conducir a menudo a circuitos más optimizados, a costa de un mayor tiempo de ejecución. -
El número de qubits en
BackendConfigurationa través de la propiedadnum_qubits. Antes sólo era accesible a través del atributon_qubits. -
Dos nuevos métodos,
angles()yangles_and_phase()se han añadido a la claseqiskit.quantum_info.OneQubitEulerDecomposerclase. Estos métodos devolverán los parámetros relevantes sin validación, y al llamar al objetoOneQubitEulerDecomposerse realizará la síntesis completa con validación. -
Se ha añadido una base de descomposición
RRalqiskit.quantum_info.OneQubitEulerDecomposerpara descomponer un 2x2 unitario arbitrario en un circuito de dosRGate. -
Añade la posibilidad de establecer
qargsa los objetos que son subclases de la clase abstractaBaseOperator. Esto se hace llamando al objetoop(qargs)(dondeopes una clase de operador) y devolverá una copia superficial del objeto original con una propiedad qargs establecida. Cuando se utiliza un objeto de este tipo con la funcióncompose()odot()se utilizará el valor interno de qargs cuando no se utilice el métodoqargskwarg. Esto permite, por ejemplo, la composición de subsistemas mediante operadores binarios:from qiskit.quantum_info import Operator init = Operator.from_label('III') x = Operator.from_label('X') h = Operator.from_label('H') init @ x([0]) @ h([1]) -
Añade
qiskit.quantum_info.Cliffordal módulo quantum_info. Este operador es una representación simpléctica eficiente un operador unitario N-qubit del grupo Clifford. Esta clase incluye unto_circuit()método de compilación enQuantumCircuitde compuertas Clifford con un número mínimo de compuertas CX para un máximo de 3 qubits. También proporciona compilación general para N > 3 qubits, pero este método no es óptimo en el número de puertas de dos qubits. -
Añade
qiskit.quantum_info.SparsePauliOpclase de operador. Se trata de una representación eficiente de una matriz N-qubit que es dispersa en la base Pauli y utiliza unqiskit.quantum_info.PauliTabley un vector de coeficientes complejos para su estructura de datos.Esta clase soporta gran parte de la misma funcionalidad de la clase
qiskit.quantum_info.Operatorde modo queSparsePauliOpobjetos pueden ser tensados, compuestos, multiplicados escalarmente, sumados y restados.Las matrices u objetos
Operatorse pueden convertir enSparsePauliOputilizando el método :class:`~qiskit.quantum_info.SparsePauliOp.from_operator.SparsePauliOppuede convertirse a una matriz csr_matrix dispersa o a una matriz Numpy densa utilizando el métodoto_matrixo a un objetoOperatormediante el métodoto_operatormétodo.A
SparsePauliOppuede iterarse en términos de sus componentes y coeficientesPauliTable, sus coeficientes y etiquetas de cadenas de Pauli utilizando el métodolabel_iter()y los componentes (densos o dispersos) de la matriz mediante el métodomatrix_iter()método. -
Añadir
qiskit.quantum_info.diamond_norm()función para calcular la norma diamante (norma traza completamente acotada) de un canal cuántico. Esto puede utilizarse para calcular la distancia entre dos canales cuánticos utilizandodiamond_norm(chan1 - chan2). -
Se ha añadido una nueva clase
qiskit.quantum_info.PauliTable. Se trata de una representación simpléctica eficiente de una lista de operadores de Pauli N-qubit. Algunas características de esta clase son:PauliTableobjetos pueden ser compuestos, y tensored que devolverá un objetoPauliTablecon la combinación de la operación (compose(),dot(),expand(),tensor()) entre cada elemento de la primera tabla, con cada elemento de la segunda tabla.- La suma de dos tablas actúa como concatenación de listas de los términos de cada tabla (
+). - Las tablas de Pauli pueden ordenarse por orden lexicográfico (producto tensorial) o por pesos de Pauli (
sort()). - Los elementos duplicados pueden contarse y eliminarse (
unique()). - Se puede iterar sobre PauliTable en su representación nativa de matriz booleana simpléctica, como etiquetas de cadena Pauli (
label_iter()), o como matriz Numpy densa o matrices CSR dispersas (matrix_iter()). - Comprobación de la conmutación entre elementos de la tabla de Pauli y otra tabla de Pauli (
commutes()) o de Pauli (commutes_with_all())
Consulte la documentación de la API de la clase
qiskit.quantum_info.PauliTablepara obtener más detalles. -
Añade la clase
qiskit.quantum_info.StabilizerTable. Se trata de una subclase de la claseqiskit.quantum_info.PauliTableque incluye un vector de fase booleano junto con la matriz de la tabla de Pauli. Representa una lista de operadores Estabilizadores que son operadores reales-Pauli con coeficiente +1 o -1. Dado que las matrices estabilizadoras son reales, la matriz de etiquetas"Y"se define como[[0, 1], [-1, 0]]. Consulte la documentación de la API para obtener información adicional. -
Añade
qiskit.quantum_info.pauli_basis()que devuelve una base Pauli de N-qubit como objetoqiskit.quantum_info.PauliTable. La ordenación de esta base puede ser por orden lexicográfico estándar (producto tensorial) o por el número de términos de Pauli no idénticos (peso). -
Añade
qiskit.quantum_info.ScalarOpclase de operador que representa un múltiplo escalar de un operador de identidad. Puede utilizarse para inicializar una identidad en subsistemas de dimensión arbitraria y se convertirá implícitamente en otras subclases deBaseOperator(como unqiskit.quantum_info.Operatoroqiskit.quantum_info.SuperOp) cuando se componga con ellas o se añada a ellas.Ejemplo: Operador de identidad
from qiskit.quantum_info import ScalarOp, Operator X = Operator.from_label('X') Z = Operator.from_label('Z') init = ScalarOp(2 ** 3) # 3-qubit identity op = init @ X([0]) @ Z([1]) @ X([2]) # Op XZX -
Se ha añadido un nuevo método
reshape()se ha añadido a la claseqiskit.quantum_innfo.Operatorque devuelve una copia superficial de una subclase de operador con dimensiones de entrada o salida de subsistema remodeladas. Las dimensiones combinadas de todos los subsistemas deben ser las mismas que las del operador original o se producirá una excepción. -
Añade
qiskit.quantum_info.random_clifford()para generar unqiskit.quantum_info.Cliffordaleatorio. -
Añadir
qiskit.quantum_info.random_quantum_channel()para generar un canal cuántico aleatorio con unChoi-rango en laStinespringrepresentación. -
Añada
qiskit.quantum_info.random_hermitian()para generar un Hermitiano aleatorioOperator. -
Añadir
qiskit.quantum_info.random_statevector()para generar unStatevector. -
Añade
qiskit.quantum_info.random_pauli_table()para generar unqiskit.quantum_info.PauliTablealeatorio. -
Añade
qiskit.quantum_info.random_stabilizer_table()para generar unqiskit.quantum_info.StabilizerTablealeatorio. -
Añadir un atributo
num_qubitsaqiskit.quantum_info.StateVectoryqiskit.quantum_info.DensityMatrixclases. Devuelve el número de qubits para estados N-qubit y devuelveNonepara estados no qubit. -
Añade
to_dict()yto_dict()para convertirqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixobjetos en el diccionario de notación Bra-Ket.Ejemplo
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.to_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.to_dict()) -
Añade
probabilities()yprobabilities()aqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixque devuelven una matriz de probabilidades de resultados de medición en la base de cálculo para los subsistemas especificados.Ejemplo
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities()) -
Añade
probabilities_dict()yprobabilities_dict()aqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixque devuelven una matriz de diccionario de estilo de recuento de probabilidades de resultados de medición en la base computacional para los subsistemas especificados.from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities_dict()) -
Añada
sample_counts()ysample_memory()a los métodosStatevectoryDensityMatrixpara muestrear los resultados de las mediciones en los subsistemas.Ejemplo:
Generar un diccionario de recuentos a partir de un vector de estados
from qiskit.quantum_info import Statevector psi = Statevector.from_label('+0') shots = 1024 # Sample counts dictionary counts = psi.sample_counts(shots) print('Measure both:', counts) # Qubit-0 counts0 = psi.sample_counts(shots, [0]) print('Measure Qubit-0:', counts0) # Qubit-1 counts1 = psi.sample_counts(shots, [1]) print('Measure Qubit-1:', counts1)Devuelve la matriz de resultados de medición de cada muestra
from qiskit.quantum_info import Statevector psi = Statevector.from_label('-1') shots = 10 # Sample memory mem = psi.sample_memory(shots) print('Measure both:', mem) # Qubit-0 mem0 = psi.sample_memory(shots, [0]) print('Measure Qubit-0:', mem0) # Qubit-1 mem1 = psi.sample_memory(shots, [1]) print('Measure Qubit-1:', mem1) -
Añade un método
measure()al métodoqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixclases de estado cuántico. Esto permite muestrear un único resultado de medición de los subsistemas especificados y contraer el vector de estado al estado base computacional posterior a la medición. Por ejemplofrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Measure both qubits outcome, psi_meas = psi.measure() print("measure([0, 1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) # Measure qubit-1 only outcome, psi_meas = psi.measure([1]) print("measure([1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) -
Añade un método
reset()al métodoqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixclases de estado cuántico. Esto permite restablecer algunos o todos los subsistemas al estado . Por ejemplofrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Reset both qubits psi_reset = psi.reset() print("Post reset state: ") print(psi_reset) # Reset qubit-1 only psi_reset = psi.reset([1]) print("Post reset([1]) state: ") print(psi_reset) -
Se ha añadido una nueva función de visualización
qiskit.visualization.visualize_transition()para visualizar las transiciones de puerta de un solo qubit. Toma un único circuito qubit y devuelve una animación de las transiciones de estado de los qubits en una esfera de Bloch. Para utilizar esta función debe tener instaladas las dependencias para y configurado globalmente un matplotlib animtion writer. Puede consultar la documentación de matplotlib para obtener más detalles al respecto. Sin embargo, en el caso por defecto basta con asegurarse de que FFmpeg está instalado para utilizar esta función.Admite circuitos con las siguientes puertas:
HGateXGateYGateZGateRXGateRYGateRZGateSGateSdgGateTGateTdgGateU1Gate
Por ejemplo:
from qiskit.visualization import visualize_transition from qiskit import * qc = QuantumCircuit(1) qc.h(0) qc.ry(70,0) qc.rx(90,0) qc.rz(120,0) visualize_transition(qc, fpg=20, spg=1, trace=True) -
execute()tiene un nuevo kwargschedule_circuit. Mediante la configuración deschedule_circuit=Truese permite la programación del circuito en unSchedule. Esto permite a los usuarios que construyenqiskit.circuit.QuantumCircuitobjetos hacer uso de métodos personalizados del planificador, como los métodosas_late_as_possibleyas_soon_as_possible. Por ejemplo:job = execute(qc, backend, schedule_circuit=True, scheduling_method="as_late_as_possible") -
Se puede establecer una nueva variable de entorno
QISKIT_SUPPRESS_PACKAGING_WARNINGSaYoyque suprimirá las advertencias sobreqiskit-aeryqiskit-ibmq-providerque no estén instalados en el momento de la importación. Esto es útil para los usuarios que sólo están ejecutando qiskit-terra (o simplemente no qiskit-aer y/o qiskit-ibmq-provider) y las advertencias no son una indicación de un potencial problema de empaquetado. Puede establecer la variable de entorno enNonpara asegurarse de que las advertencias se activan siempre, incluso si el archivo de configuración de usuario está configurado para desactivarlas. -
Se ha añadido una nueva opción de archivo de configuración de usuario,
suppress_packaging_warnings. Cuando se establece entrueen su archivo de configuración de usuario como:[default] suppress_packaging_warnings = truesuprimirá las advertencias de que
qiskit-aeryqiskit-ibmq-providerno están instalados en el momento de la importación. Esto es útil para los usuarios que sólo están ejecutando qiskit-terra (o simplemente no qiskit-aer y/o qiskit-ibmq-provider) y las advertencias no son una indicación de un potencial problema de empaquetado. Si el archivo de configuración del usuario está configurado para desactivar las advertencias, esto se puede anular configurandoQISKIT_SUPPRESS_PACKAGING_WARNINGScomoNon -
qiskit.compiler.transpile()tiene dos nuevos kwargs,layout_methodyrouting_method. Permiten seleccionar un método concreto para la colocación y el encaminamiento de circuitos en arquitecturas con restricciones. Por ejemplo:transpile(circ, backend, layout_method='dense', routing_method='lookahead')ejecutará
DenseLayoutpase de diseño yLookaheadSwapenrutamiento. -
Se ha simplificado considerablemente el estilo de construcción de las instrucciones Pulse.
Con el estilo anterior,
Commands se llamaba con canales para hacer unInstruction. El uso tanto de las órdenes como de las instrucciones fue un punto de confusión. Este era el estilo anterior:sched += Delay(5)(DriveChannel(0)) sched += ShiftPhase(np.pi)(DriveChannel(0)) sched += SamplePulse([1.0, ...])(DriveChannel(0)) sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))o, de forma equivalente (aunque menos utilizada):
sched += DelayInstruction(Delay(5), DriveChannel(0)) sched += ShiftPhaseInstruction(ShiftPhase(np.pi), DriveChannel(0)) sched += PulseInstruction(SamplePulse([1.0, ...]), DriveChannel(0)) sched += AcquireInstruction(Acquire(100), AcquireChannel(0), MemorySlot(0))Ahora, en lugar de construir un comando y una instrucción, cada comando se ha migrado a una instrucción:
sched += Delay(5, DriveChannel(0)) sched += ShiftPhase(np.pi, DriveChannel(0)) sched += Play(SamplePulse([1.0, ...]), DriveChannel(0)) sched += SetFrequency(5.5, DriveChannel(0)) # New instruction! sched += Acquire(100, AcquireChannel(0), MemorySlot(0)) -
Ahora existe una instrucción
Playque toma una descripción de una envolvente de pulso y un canal. Existe una nueva clasePulseenpulse_libde la que debería subclasificarse la descripción de la envolvente de impulsos.Por ejemplo:
Play(SamplePulse([0.1]*10), DriveChannel(0)) Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))
Notas de actualización
-
El método
qiskit.dagcircuit.DAGNodepop, obsoleto en la versión 0.9.0, ha sido eliminado. Si utiliza este método, puede aprovechar la sentenciadelo la funcióndelattr()de Python para realizar la misma tarea. -
Se ha añadido un nuevo requisito opcional de visualización, pygments. Se utiliza para resaltar la sintaxis del código OpenQASM 2.0 en los widgets Jupyter y, opcionalmente, para el método
qiskit.circuit.QuantumCircuit.qasm()método. Debe instalarse (ya sea conpip install pygmentsopip install qiskit-terra[visualization]) antes de utilizar el widget%circuit_library_infoenqiskit.tools.jupytero el kwargformatteden el métodoqasm()método. -
La opción pulse
bufferque se encuentra enqiskit.pulse.Channelyqiskit.pulse.Scheduleestaba obsoleta en Terra 0.11.0 y ha sido eliminada. Para añadir un retardo en un canal o en una programación, especifíquelo explícitamente en su Programación con un Retardo:sched = Schedule() sched += Delay(5)(DriveChannel(0)) -
PulseChannelSpecque estaba obsoleto en Terra 0.11.0, ha sido eliminado. Utilice BackendConfiguration en su lugar:config = backend.configuration() drive_chan_0 = config.drives(0) acq_chan_0 = config.acquires(0)o, simplemente, haga referencia al canal directamente, como
DriveChannel(index). -
Una ruta de importación estaba obsoleta en Terra 0.10.0 y ahora se ha eliminado: para
PulseChannel,DriveChannel,MeasureChannel, yControlChannel, utilicefrom qiskit.pulse.channels import Xen lugar defrom qiskit.pulse.channels.pulse_channels import X. -
El pase
qiskit.transpiler.passes.CSPLayout(que se introdujo en la versión 0.11.0 ) se ha añadido al gestor de pases predefinidos para los niveles de optimización 2 y 3. Para el nivel 2, hay un límite de llamadas de 1.000 y un tiempo de espera de 10 segundos. Para el nivel 3, el límite de llamadas es de 10.000 y el tiempo de espera es de 1 minuto.Ahora que el pase está incluido en los gestores de pases predefinidos, el paquete python-constraint ya no es una dependencia opcional y se ha añadido a la lista de requisitos.
-
La clase
TranspileConfigque se utilizaba anteriormente para establecer la configuración en tiempo de ejecución de una aplicaciónqiskit.transpiler.PassManagerha sido eliminada y sustituida por una nueva claseqiskit.transpile.PassManagerConfig. Esta nueva clase se ha estructurado para incluir únicamente la información necesaria para construir unPassManager. Los atributos de esta clase son:initial_layoutbasis_gatescoupling_mapbackend_propertiesseed_transpiler
-
La función
transpile_circuitenqiskit.transpilerha sido eliminada. Para transpilar un circuito con unPassManagerdebe utilizar el métodorun()del objeto :class:~qiskit.transpiler.PassManager`. -
El método
QuantumCircuitmétododraw()yqiskit.visualization.circuit_drawer()ya no incluirán el estado inicial incluido por defecto en las visualizaciones. Si desea conservar el estado inicial en la visualización de salida, debe configurarinitial_statekwarg enTrue. Por ejemplo, corriendo:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text')Esto ya no incluye el estado inicial. Si quieres conservarlo, puedes presentarte:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text', initial_state=True) -
qiskit.compiler.transpile()(yqiskit.execute.execute(), que utilizatranspileinternamente) emitirá ahora un error cuando se establezca el kwargpass_managery se establezca un valor para otros kwargs que ya estén establecidos en un objeto instanciadoPassManagerinstanciado. Anteriormente, estos kwargs conflictivos se ignoraban silenciosamente y se utilizaban los valores de la instanciaPassManager. Por ejemplo:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.pass_manager_config import PassManagerConfig from qiskit.transpiler import preset_passmanagers from qiskit.compiler import transpile qc = QuantumCircuit(5) config = PassManagerConfig(basis_gates=['u3', 'cx']) pm = preset_passmanagers.level_0_pass_manager(config) transpile(qc, optimization_level=3, pass_manager=pm)dará lugar a un error, mientras que antes de esta versión se utilizaba el valor de
pmy se ignoraba el valor del kwarg deoptimization_level. Los kwargs detranspilea los que se aplica esto son:optimization_levelbasis_gatescoupling_mapseed_transpilerbackend_propertiesinitial_layoutlayout_methodrouting_methodbackend
-
En
Operator,Clifford,SparsePauliOp,PauliTable,StabilizerTable, las clases de operador tienen un métodocallañadido que les permite asignar un qargs al operador para su uso con el métodocompose(),dot(),evolve()y-. -
El método de adición de la clase
qiskit.quantum_info.Operatoracepta ahora un kwargqargpara permitir la adición de un operador más pequeño a uno más grande asumiendo identidades en los otros subsistemas (igual que paraqargsencompose()ydot()). Esto permite añadir subsistemas utilizando el método de llamada como en el caso de la composición. Este soporte se añade a todas las subclases de BaseOperator (ScalarOp,Operator,QuantumChannel).Por ejemplo:
from qiskit.quantum_info import Operator, ScalarOp ZZ = Operator.from_label('ZZ') # Initialize empty Hamiltonian n_qubits = 10 ham = ScalarOp(2 ** n_qubits, coeff=0) # Add 2-body nearest neighbour terms for j in range(n_qubits - 1): ham = ham + ZZ([j, j+1]) -
La clase
BaseOperatorse ha actualizado para que la suma, la resta y la multiplicación escalar dejen de ser métodos abstractos. Esto significa que ya no es necesario implementarlos en las subclases si no están soportados. La clase base lanzará unNotImplementedErrorcuando los métodos no estén definidos. -
La función
qiskit.quantum_info.random_density_matrix()devolverá un objetoDensityMatrixaleatorio. En versiones anteriores devolvía un array numpy. -
En
qiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixya no copian la matriz de entrada si ya tiene el dtype correcto. -
fastjsonschema se añade como dependencia. Se utiliza para una validación mucho más rápida de los diccionarios qobj con respecto al esquema JSON cuando se llama al método
to_dict()en objetos qobj con el argumento de palabra clavevalidateestablecido enTrue. -
Las clases de construcción qobj en
qiskit.qobjya no se validarán contra el qobj jsonschema por defecto. Entre ellas se incluyen las siguientes clases:qiskit.qobj.QasmQobjInstructionqiskit.qobj.QobjExperimentHeaderqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QobjHeaderqiskit.qobj.PulseQobjInstructionqiskit.qobj.PulseQobjExperimentConfigqiskit.qobj.PulseQobjExperimentqiskit.qobj.PulseQobjConfigqiskit.qobj.QobjMeasurementOptionqiskit.qobj.PulseLibraryItemqiskit.qobj.QasmQobjInstructionqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QasmQobjqiskit.qobj.PulseQobj
Si confías en esta validación o quieres validarlos contra el esquema qobj, puedes hacerlo configurando el kwarg
validateaTrueen el métodoto_dict()de cualquiera de las clases Qobj de nivel superiorQasmQobjoPulseQobj. Por ejemplo:que validará el diccionario de salida contra el Qobj jsonschema.
-
El diccionario de salida de
qiskit.qobj.QasmQobj.to_dict()yqiskit.qobj.PulseQobj.to_dict()ya no está en un formato para serialización json directa, tal y como espera la API de IBMQ. Estos objetos Qobj son el formato actual que utilizamos para pasar experimentos a los proveedores/backends y, aunque tener un formato de diccionario que pudiera pasarse directamente a la API de IBMQ era moderadamente útil paraqiskit-ibmq-provider, dificultaba las cosas para otros proveedores. Especialmente para los proveedores que envuelven simuladores locales. En el futuro, las definiciones de lo que se transmite entre proveedores y el formato de solicitud de la API IBMQ se desacoplarán aún más (de forma compatible con versiones anteriores), lo que debería aliviar la carga de escribir proveedores y backends.En la práctica, la única diferencia funcional entre la salida de estos métodos ahora y las versiones anteriores es que los números complejos se representan con el tipo
complexy las matrices numpy ya no se convierten silenciosamente a lista. Si anteriormente llamaba ajson.dumps()directamente sobre la salida deto_dict(), después de esta versión necesitará un codificador json personalizado para manejar estos casos. Por ejemplo:import json from qiskit.circuit import ParameterExpression from qiskit import qobj my_qasm = qobj.QasmQobj( qobj_id='12345', header=qobj.QobjHeader(), config=qobj.QasmQobjConfig(shots=1024, memory_slots=2, max_credits=10), experiments=[ qobj.QasmQobjExperiment(instructions=[ qobj.QasmQobjInstruction(name='u1', qubits=[1], params=[0.4]), qobj.QasmQobjInstruction(name='u2', qubits=[1], params=[0.4, 0.2]) ]) ] ) qasm_dict = my_qasm.to_dict() class QobjEncoder(json.JSONEncoder): """A json encoder for pulse qobj""" def default(self, obj): # Convert numpy arrays: if hasattr(obj, 'tolist'): return obj.tolist() # Use Qobj complex json format: if isinstance(obj, complex): return (obj.real, obj.imag) if isinstance(obj, ParameterExpression): return float(obj) return json.JSONEncoder.default(self, obj) json_str = json.dumps(qasm_dict, cls=QobjEncoder)generará una cadena json de la misma manera que lo hacía
json.dumps(my_qasm.to_dict())en versiones anteriores. -
CmdDefestá obsoleto desde Terra 0.11.0 y ha sido eliminado. Siga utilizandoInstructionScheduleMapen su lugar. -
Los métodos
cmdsycmd_qubitsenInstructionScheduleMaphan quedado obsoletos desde Terra 0.11.0 y han sido eliminados. Por favor, utiliceinstructionsyqubits_with_instructionen su lugar. -
PulseDefaults han informado de
qubit_freq_estymeas_freq_esten Hz en lugar de en GHz desde que Terra publicó 0.11.0. Se ha eliminado una advertencia que notificaba este cambio. -
Se ha eliminado el soporte previamente obsoleto (en la versión 0.11.0 ) para pasar parámetros de los tipos,, (nodo AST QASM y )
qiskit.circuit.Instructionde los tipossympy.Basic,sympy.Expr,qiskit.qasm.node.node.Node(nodo QASM AST) ysympy.Matrix. Los tipos admitidos para los parámetros de instrucción son:intfloatcomplexstrlistnp.ndarrayqiskit.circuit.ParameterExpression
-
Las siguientes propiedades de
BackendConfiguration:dtdtmrep_time
todas tienen unidades de segundos. Antes del lanzamiento 0.11.0,
dtydtmtenían unidades de nanosegundos. Antes de la versión 0.12.0,rep_timetenía unidades de microsegundos. Las advertencias que alertaban a los usuarios de estos cambios ya se han eliminado deBackendConfiguration. -
Se ha añadido un nuevo requisito a la lista de requisitos, retworkx. Se trata de una biblioteca de grafos con licencia Apache 2.0 que tiene una API similar a la de networkx y se está utilizando para acelerar significativamente las
qiskit.dagcircuit.DAGCircuitoperaciones como parte del transpilador. Hay binarios publicados en PyPI para todas las plataformas soportadas por Qiskit Terra pero si estás usando una plataforma donde no hay binarios precompilados publicados consulta la documentación de retworkx para instrucciones sobre la instalación pip desde sdist.Si tiene algún problema con el transpilador o la clase DAGCircuit como parte de la transición, puede volver a la implementación anterior de networkx estableciendo la variable de entorno
USE_RETWORKXenN. Esta opción se eliminará en la versión 0.14.0.
Notas sobre características en desuso
-
Pasar los datos al constructor de
qiskit.dagcircuit.DAGNodecomo un diccionario argdata_dictestá obsoleto y será eliminado en una futura versión. En su lugar, ahora debe pasar los campos como kwargs al constructor. Por ejemplo el comportamiento anterior de:from qiskit.dagcircuit import DAGNode data_dict = { 'type': 'in', 'name': 'q_0', } node = DAGNode(data_dict)debería ser ahora:
from qiskit.dagcircuit import DAGNode node = DAGNode(type='in', name='q_0') -
Se han actualizado los nombres de los objetos y métodos de las puertas para que sean más coherentes. Se han realizado los cambios siguientes:
- Todas las puertas de Pauli tienen una sola letra mayúscula (
I,X,Y,Z) - Las puertas de Pauli parametrizadas (es decir, las rotaciones) van precedidas de la letra mayúscula
R(RX,RY,RZ) - Una versión controlada antepone la letra mayúscula
C(CX,CRX,CCX) - Las puertas se denominan según su acción, no según sus nombres alternativos (
CCX, noToffoli)
Los nombres antiguos han quedado obsoletos y se eliminarán en una próxima versión. Esta es una lista de los cambios mostrando la antigua y la nueva clase, el atributo nombre y los métodos. Si una nueva columna está en blanco, entonces no hay ningún cambio para eso.
Clase antiguaClase nuevaNombre antiguo AtributoNuevo atributo de nombreAntiguoqiskit.circuit.QuantumCircuitmétodoNuevoqiskit.circuit.QuantumCircuitmétodoToffoliGateCCXGateccxccx()ytoffoli()CrxGateCRXGatecrxcrx()CryGateCRYGatecrycry()CrzGateCRZGatecrzcrz()FredkinGateCSwapGatecswapcswap()yfredkin()Cu1GateCU1Gatecu1cu1()Cu3GateCU3Gatecu3cu3()CnotGateCXGatecxcx()ycnot()CyGateCYGatecycy()CzGateCZGateczcz()DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()IdGateIGateidideni()yid()Isometryisoisometryiso()isometry()yiso()UCGUCGatemultiplexerucguc()UCRotUCPauliRotGateUCXUCRXGateucrotXucrxucxucrx()UCYUCRYGateucrotyucryucyucry()UCZUCRZGateucrotzucrzuczucrz() - Todas las puertas de Pauli tienen una sola letra mayúscula (
-
El kwarg
periodpara la funciónsquare(),sawtooth(), ytriangle()enqiskit.pulse.pulse_libes ahora obsoleto y será eliminado en una futura versión. En su lugar, ahora debe utilizar el kwargfreqpara ajustar la frecuencia. -
Los métodos
DAGCircuit.compose_back()yDAGCircuit.extend_back()están obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizar el métodoqiskit.dagcircuit.DAGCircuit.compose()que es un método más general y más flexible que proporciona la misma funcionalidad. -
El kwarg
callbackdel constructor de la claseqiskit.transpiler.PassManagerha quedado obsoleto y se eliminará en una futura versión. En lugar de establecerlo a nivel de objeto durante la creación, ahora debería establecerse como un parámetro kwarg en el métodoqiskit.transpiler.PassManager.run()método. -
Las palabras clave
n_qubitsynumberofqubitsquedan obsoletas en Terra y se sustituyen pornum_qubits. Los nombres antiguos se eliminarán en una próxima versión. A continuación se enumeran los objetos afectados por este cambio:ClaseMétodo antiguoNuevo métodoQuantumCircuitn_qubitsnum_qubits()Paulinumberofqubitsnum_qubits()FunciónViejo argumentoNuevo argumentorandom_circuit()n_qubitsnum_qubitsMSGaten_qubitnum_qubits -
La función
qiskit.quantum_info.synthesis.euler_angles_1qha quedado obsoleta. Ha sido sustituida por la claseqiskit.quantum_info.OneQubitEulerDecomposerque ofrece la misma funcionalidad:OneQubitEulerDecomposer().angles(mat) -
El kwarg
pass_managerpara elqiskit.compiler.transpile()ha quedado obsoleto y se eliminará en una futura versión. En adelante, la forma preferida de transpilar un circuito con un objeto personalizadoPassManagerpersonalizado es utilizar el métodorun()del objetoPassManager. -
La función
qiskit.quantum_info.random_state()ha quedado obsoleta y se eliminará en una futura versión. En su lugar, debe utilizar la funciónqiskit.quantum_info.random_statevector()función -
Los métodos
add,subtract, ymultiplyde laqiskit.quantum_info.Statevectoryqiskit.quantum_info.DensityMatrixestán obsoletos y se eliminarán en una futura versión. En su lugar, debe utilizar los operadores binarios+,-,*. -
Deja obsoletos
qiskit.quantum_info.Statevector.to_counts(),qiskit.quantum_info.DensityMatrix.to_counts(), yqiskit.quantum_info.counts.state_to_counts(). Estas funciones son sustituidas por los métodos de claseqiskit.quantum_info.Statevector.probabilities_dict()yqiskit.quantum_info.DensityMatrix.probabilities_dict(). -
SamplePulseyParametricPulses (por ejemplo,Gaussian) ahora subclase dePulsey se han movido a laqiskit.pulse.pulse_lib. La ruta anterior a través depulse.commandses obsoleta y se eliminará en una futura versión. -
DelayInstructionha quedado obsoleto y ha sido sustituido porDelay. Esta nueva instrucción se ha tomado sobre la anteriorCommandDelay. El patrón de migración es:Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>) DelayInstruction(Delay(<duration>), <channel>) -> Delay(<duration>, <channel>)Hasta que finalice el periodo de desaprobación, también se admitirá la sintaxis anterior de
Delaypara llamar a un comando en un canal:Delay(<phase>)(<channel>)La nueva instrucción
Delayno admite el atributocommand. -
FrameChangeyFrameChangeInstructionhan quedado obsoletos y se han sustituido porShiftPhase. Los cambios son:FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>) FrameChangeInstruction(FrameChange(<phase>), <channel>) -> ShiftPhase(<phase>, <channel>)Hasta que finalice el periodo de desaprobación, se admitirá la sintaxis anterior de FrameChange para llamar a un comando en un canal:
ShiftPhase(<phase>)(<channel>) -
El método
calldeSamplePulseyParametricPulses ha quedado obsoleto. La migración es la siguiente:Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>) -
AcquireInstructionha quedado obsoleto y ha sido sustituido porAcquire. Los cambios son:Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>) AcquireInstruction(Acquire(<duration>), <**channels>) -> Acquire(<duration>, <**channels>)Hasta que finalice el periodo de desaprobación, se admitirá la sintaxis anterior de Acquire para llamar al comando en un canal:
Acquire(<duration>)(<**channels>)
Corrección de errores
-
El
BarrierBeforeFinalMeasurementstranspiler pass, incluido en los niveles de transpiler preestablecidos cuando se apunta a un dispositivo físico, anteriormente insertaba una barrera a través de qubits medidos solamente. En algunos casos, esto permitía al transpilador insertar un swap después de una operación de medida, haciendo que el circuito no fuera válido para los dispositivos actuales. El pase se ha actualizado para que la barrera insertada abarque todos los qubits del dispositivo. Correcciones #3937 -
Al ampliar una
QuantumCircuitinstancia (extendido) con otro circuito (extensión), el circuito se toma por referencia. Si un circuito se extiende consigo mismo, se produce un bucle infinito, ya que el extendido y la extensión son lo mismo. Este error se ha resuelto copiando la extensión si es el mismo objeto que el extendido. Correcciones #3811 -
Corrige un caso en
qiskit.result.Result.get_counts()en el que no se podía hacer referencia a los resultados de una caducidad si el experimento se inicializaba como un Programa sin nombre. Correcciones nº 2753 -
Anteriormente, la sustitución de
Parameterde un circuito por nuevos objetos Parameter antes de descomponer un circuito provocaba que los valores sustituidos no se sustituyeran correctamente en las puertas descompuestas. Esto se ha resuelto de forma que la unión y la descomposición puedan producirse en cualquier orden. -
El backend de salida de matplotlib para la función
qiskit.visualization.circuit_drawer()función yqiskit.circuit.QuantumCircuit.draw()se ha corregido para que muestre correctamenteCU1Gategates. Correcciones #3684 -
Un error en
qiskit.circuit.QuantumCircuit.from_qasm_str()yqiskit.circuit.QuantumCircuit.from_qasm_file()al cargar QASM con puertas personalizadas definidas. Ahora, cargando este QASM:OPENQASM 2.0; include "qelib1.inc"; gate rinv q {sdg q; h q; sdg q; h q; } qreg q[1]; rinv q[0];es equivalente al siguiente circuito:
rinv_q = QuantumRegister(1, name='q') rinv_gate = QuantumCircuit(rinv_q, name='rinv') rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv = rinv_gate.to_instruction() qr = QuantumRegister(1, name='q') expected = QuantumCircuit(qr, name='circuit') expected.append(rinv, [qr[0]])Correcciones #1566
-
Permitir que las instrucciones de circuitos cuánticos tengan valores de parámetros de lista. Se utiliza en Aer para los parámetros de instantánea de valor de expectativa, por ejemplo
params = [[1.0, 'I'], [1.0, 'X']]]para . -
Anteriormente, para los circuitos que contenían puertas compuestas (las creadas mediante
qiskit.circuit.QuantumCircuit.to_gate()oqiskit.circuit.QuantumCircuit.to_instruction()o sus convertidores correspondientes), si se intentaba enlazar el circuito más de una vez, al transpilarlo sólo se aplicaba el primer valor de enlace a todos los circuitos. Esto se ha resuelto para que se respeten correctamente los valores proporcionados para las vinculaciones posteriores.
Otras notas
-
Las clases qasm y pulse qobj:
QasmQobjInstructionQobjExperimentHeaderQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQobjHeaderPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItemQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmQobjPulseQobj
de
qiskit.qobjse han reimplementado sin utilizar la biblioteca marsmallow. Estas nuevas implementaciones están diseñadas para ser de reemplazo drop-in (a excepción de lo indicado en las notas de la versión de actualización), pero los detalles heredados de malvavisco pueden no funcionar. Si encuentra alguna incompatibilidad, no dude en consultarnos.
Aer 0.5.0
Añadido
- Añadir soporte para puerta diagonal terra
- Añadir soporte para qobj parametrizado
Fijo
- Añadido postfix para linux en Raspberry Pi
- Manejar entradas de array numpy desde qobj
Ignis 0.3.0
Añadido
- Documentación de API
- Evaluación comparativa aleatoria CNOT-Diédrica
- Módulo de acreditación para la acreditación de salida de dispositivos ruidosos
- Calibración de impulsos para qubits individuales
- Discriminador de impulsos
- Circuitos de verificación del entrelazamiento
- Tomografía de conjuntos de compuertas para conjuntos de compuertas de un solo qubit
- Añade funciones de utilidad de evaluación comparativa aleatorias
calculate_1q_epg,calculate_2q_epgfunciones para calcular el error de 1 y 2 qubits por puerta a partir del error por Clifford - Añade funciones de utilidad de evaluación comparativa aleatorias
calculate_1q_epc,calculate_2q_epcpara calcular el error de 1 y 2 qubits por Clifford a partir del error por puerta
Cambiado
- Soporte de etiquetas enteras para qubits en tomografía
- Admite etiquetas enteras para mitigar los errores de medición
En desuso
- Deja obsoleta la función
twoQ_clifford_error. Utilicecalculate_2q_epcen su lugar. - Python 3.5 en qiskit-ignis está obsoleto. El soporte se retirará en la fecha de fin de vida de la versión para la comunidad python, que es el 13/09/2020.
Aqua 0.6.5
Sin cambios
IBM Proveedor Q 0.6.0
Sin cambios