QuantumCircuit clase
class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Bases: IR
Representación en Qiskit de un circuito cuántico.
Para más detalles sobre cómo situar el QuantumCircuit en el contexto de todas las estructuras de datos que lo acompañan, cómo encaja en el resto del paquete qiskit y los diferentes regímenes de descripciones de circuitos cuánticos en Qiskit, véase la documentación a nivel de módulo de qiskit.circuit.
Ejemplo:
from qiskit import QuantumCircuit
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0, 1)
# Return a text drawing of the circuit.
qc.draw() ┌───┐
q_0: ┤ H ├──■──
└───┘┌─┴─┐
q_1: ─────┤ X ├
└───┘Atributos del circuito
QuantumCircuit tiene un pequeño número de atributos públicos, que son en su mayoría funcionalidades antiguas. La mayor parte de su funcionalidad se accede a través de métodos.
Un pequeño puñado de los atributos son intencionadamente mutables, el resto son atributos de datos que deben considerarse inmutables.
Atributo mutable | Resumen |
|---|---|
global_phase | La fase global del circuito, medida en radianes. |
metadata | Asignación arbitraria del usuario, que Qiskit conservará a través del transpilador, pero que por lo demás ignorará completamente. |
name | Un nombre de cadena opcional para el circuito. |
Atributo de datos inmutable | Resumen |
|---|---|
ancillas | Lista de AncillaQubits rastreados por el circuito. |
cregs | Lista de ClassicalRegisters rastreados por el circuito. |
clbits | Lista de Clbits rastreados por el circuito. |
data | Lista de las CircuitInstruction personas que forman parte del circuito. |
_data | Referencia de Python a los datos subyacentes nativos de Rust, utilizada por el objeto QkCircuit de la API de C. |
duration | Duración total del circuito, sumada por la programación de las pasadas del transpilador. Este atributo está obsoleto y estimate_duration() en su lugar. |
layout | Diseño de hardware e información de enrutamiento añadida por el transpilador. |
num_ancillas | El número de qubits ancilla del circuito. |
num_clbits | El número de clbits del circuito. |
num_captured_vars | Número de variables clásicas capturadas en tiempo real. |
num_captured_stretches | Número de tramos capturados. |
num_declared_vars | Número de variables clásicas en tiempo real declaradas localmente en el ámbito del circuito exterior. |
num_declared_stretches | Número de tramos declarados localmente en el ámbito del circuito exterior. |
num_input_vars | Número de variables clásicas de entrada en tiempo real. |
num_parameters | ParameterNúmero de «s» en tiempo de compilación que hay en el circuito. |
num_qubits | Número de qubits del circuito. |
num_vars | Número total de variables clásicas en tiempo real en el ámbito del circuito exterior. |
num_stretches | Número total de tramos en el ámbito del circuito exterior. |
num_identifiers | Número total tanto de variables como de tramos en el circuito exterior. |
op_start_times | Horas de inicio de las operaciones programadas, añadidas mediante la programación de pases del transpilador. |
parameters | ParameterVista ordenada, similar a un conjunto, de los valores de tiempo de compilación que sigue el circuito. |
qregs | Lista de QuantumRegisters rastreados por el circuito. |
qubits | Lista de Qubits rastreados por el circuito. |
unit | La unidad del duration campo. |
El atributo principal es data. Se trata de un objeto similar a una secuencia que muestra los CircuitInstructionelementos que contiene de forma ordenada. Por lo general, no se debe modificar este objeto directamente; QuantumCircuit está diseñado únicamente para operaciones de solo añadir (para las que se debe utilizar append()). La mayoría de las operaciones que modifican circuitos in situ deben escribirse como pasadas del transpilador (qiskit.transpiler). La API de C interactúa con un objeto interno, denominado _data, que no forma parte de la API pública de Python, salvo como identificador que se pasa a las llamadas a la API de C.
data
Los datos del circuito (instrucciones y contexto).
Ejemplo
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.measure([0], [1])
print(qc.data)[CircuitInstruction(operation=Instruction(name='measure', num_qubits=1,
num_clbits=1, params=[]), qubits=(Qubit(QuantumRegister(2, 'q'), 0),),
clbits=(Clbit(ClassicalRegister(2, 'c'), 1),))]Devuelve
Un objeto similar a una lista que contiene las CircuitInstruction instancias del circuito.
_data
Tipo: CircuitData
Un manipulador opaco al objeto nativo de Rust subyacente QuantumCircuit.
Este objeto se corresponde directamente con el objeto de la API de C QkCircuit.
Ningún elemento de este objeto, salvo su propia existencia, forma parte de la API pública de Python.
Hay muy pocos usos válidos de este objeto en Python. Puedes pasárselo a funciones que esperan el tipo de la API de C QkCircuit, como aquellas que llamarán a qk_circuit_borrow_from_python(); puedes utilizarlo como un passmanager.IR; puedes reconstruir el circuito completo con QuantumCircuit.from_circuit_data().
Además de data, la global_phase de un circuito puede influir en cierta medida en su salida, si el circuito se utiliza para describir un Gate que pueda controlarse. Se mide en radianes y se puede ajustar directamente.
global_phase
La fase global del alcance del circuito actual en radianes.
Ejemplo
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)0.0from numpy import pi
circuit.global_phase = pi/4
print(circuit.global_phase)0.7853981633974483El name nombre de un circuito pasa a ser el nombre de la función Instruction o Gate del resultado derivado de to_instruction() las llamadas a y to_gate() , lo cual puede resultar útil para las visualizaciones.
name
Tipo: str
Un nombre legible para el circuito.
Ejemplo
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuitPuede adjuntar metadata a un circuito. Ninguna parte del núcleo de Qiskit inspeccionará esto o cambiará su comportamiento basándose en los metadatos, pero se pasarán fielmente a través del transpilador, para que puedas etiquetar tus circuitos tú mismo. Al serializar un circuito con QPY (véase qiskit.qpy), los metadatos serán serializados en JSON y puede que necesites pasar un serializador personalizado para manejar objetos no compatibles con JSON dentro de él (ver qpy.dump() para más detalles). Este campo se ignora durante la exportación a OpenQASM 2 o 3.
metadata
Diccionario arbitrario de metadatos definido por el usuario para el circuito.
Qiskit no examinará el contenido de este mapeo, pero lo pasará a través del transpilador y lo volverá a adjuntar a la salida, por lo que puede realizar un seguimiento de sus propios metadatos.
Ejemplo
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})
print(qc.metadata){'experiment_type': 'Bell state experiment'}QuantumCircuit muestra los atributos de los datos que permiten realizar un seguimiento de sus bits y registros internos, tanto cuánticos como clásicos. Aunque parecen listobjetos de Python, debes tratarlos como inmutables; modificarlos, en el mejor de los casos, no tendrá ningún efecto y, lo más probable, es que simplemente dañe los datos internos del QuantumCircuit.
qregs
Una lista de Qubits en el orden en que fueron añadidos. No debes mutar esto.
cregs
Una lista de Clbits en el orden en que fueron añadidos. No debes mutar esto.
qubits
Una lista de Qubits en el orden en que fueron añadidos. No debes mutar esto.
ancillas
Una lista de AncillaQubits en el orden en que fueron añadidos. No debes mutar esto.
clbits
Una lista de Clbits en el orden en que fueron añadidos. No debes mutar esto.
Ejemplo
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qr1 = QuantumRegister(2)
qr2 = QuantumRegister(1)
cr1 = ClassicalRegister(2)
cr2 = ClassicalRegister(1)
qc = QuantumCircuit(qr1, qr2, cr1, cr2)
print("List the qubits in this circuit:", qc.qubits)
print("List the classical bits in this circuit:", qc.clbits)List the qubits in this circuit: [Qubit(QuantumRegister(2, 'q0'), 0),
Qubit(QuantumRegister(2, 'q0'), 1), Qubit(QuantumRegister(1, 'q1'), 0)]
List the classical bits in this circuit: [Clbit(ClassicalRegister(2, 'c0'), 0),
Clbit(ClassicalRegister(2, 'c0'), 1), Clbit(ClassicalRegister(1, 'c1'), 0)]Los parámetros de tiempo de compilación presentes en las instrucciones del circuito están disponibles en parameters. Esto tiene un orden canónico (principalmente léxico, salvo en el caso de ParameterVector), que coincide con el orden en que se asignarán los parámetros al utilizar las formas de lista de assign_parameters(), pero también admite comprobaciones de pertenencia en tiempo constante, setal estilo de.
parameters
Los parámetros definidos en el circuito.
Este atributo devuelve los Parameter objetos del circuito ordenados alfabéticamente. Ten en cuenta que los parámetros instanciados con un ParameterVector siguen ordenándose numéricamente.
Ejemplos
El siguiente fragmento muestra que el orden de inserción de los parámetros no importa.
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
>>> circuit = QuantumCircuit(1)
>>> circuit.rx(b, 0)
>>> circuit.rz(elephant, 0)
>>> circuit.ry(a, 0)
>>> circuit.parameters # sorted alphabetically!
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])Tenga en cuenta que la ordenación alfabética puede resultar poco intuitiva cuando se trata de números. El "10" literal va antes que el "2" en estricta ordenación alfabética.
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
>>> circuit = QuantumCircuit(1)
>>> circuit.u(*angles, 0)
>>> circuit.draw()
┌─────────────────────────────┐
q: ┤ U(angle_1,angle_2,angle_10) ├
└─────────────────────────────┘
>>> circuit.parameters
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])Para respetar la ordenación numérica, se puede utilizar un ParameterVector .
>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
>>> x = ParameterVector("x", 12)
>>> circuit = QuantumCircuit(1)
>>> for x_i in x:
... circuit.rx(x_i, 0)
>>> circuit.parameters
ParameterView([
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
..., ParameterVectorElement(x[11])
])Devuelve
Los objetos ordenados Parameter en el circuito.
Si has transpilado tu circuito, de modo que tienes un circuito físico, puedes inspeccionar el atributo layout para obtener información almacenada por el transpilador sobre cómo los qubits virtuales del circuito fuente se corresponden con los qubits hardware de tu circuito físico, tanto al principio como al final del circuito.
layout
Devuelve cualquier información de diseño asociada sobre el circuito.
Este atributo contiene un objeto opcional TranspileLayout . Normalmente se establece en la salida de transpile() o PassManager.run() para conservar la información sobre las permutaciones provocadas en el circuito de entrada por la transpilación.
Hay dos tipos de permutaciones provocadas por la transpile() función: una disposición inicial que permuta los qubits en función de los qubits físicos seleccionados en la Target, y una disposición final, que es una permutación de salida provocada por SwapGatelos s insertados durante el enrutamiento.
Ejemplo
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
# Create circuit to test transpiler on
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.swap(1, 2)
qc.cx(0, 1)
# Add measurements to the circuit
qc.measure([0, 1, 2], [0, 1, 2])
# Specify the QPU to target
backend = GenericBackendV2(3)
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled = pass_manager.run(qc)
# Print the layout after transpilation
print(transpiled.layout.routing_permutation())[0, 1, 2]Si su circuito también se programó como parte de una transpilación, se expondrán los tiempos individuales de cada instrucción, junto con el total duration del circuito.
duration
La duración total del circuito, fijada por un pase del transpilador de programación. Su unidad se especifica mediante unit.
La propiedad qiskit.circuit.quantumcircuit.QuantumCircuit.duration es obsoleta a partir de Qiskit 1.3.0. Se eliminará en Qiskit 3.0.0.
unit
La unidad que duration se especifica en.
La propiedad qiskit.circuit.quantumcircuit.QuantumCircuit.unit es obsoleta a partir de Qiskit 1.3.0. Se eliminará en Qiskit 3.0.0.
op_start_times
Devuelve una lista con las horas de inicio de las operaciones.
Este atributo calcula el tiempo estimado de inicio de las operaciones en el circuito programado y sólo funciona para circuitos simples que no tienen flujo de control u otras operaciones clásicas de feed-forward.
Este atributo se activa una vez que uno de los pases de análisis de programación se ejecuta en el circuito cuántico.
Ejemplo
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Print the original circuit
print("Original circuit:")
print(qc)
# Transpile the circuit with a specific basis gates list and print the resulting circuit
backend = GenericBackendV2(2, basis_gates=['u1', 'u2', 'u3', 'cx'])
pm = generate_preset_pass_manager(
optimization_level=1, backend=backend, scheduling_method="alap"
)
transpiled_qc = pm.run(qc)
print("Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:")
print(transpiled_qc)
# Print the start times of each instruction in the transpiled circuit
print("Start times of instructions in the transpiled circuit:")
for instruction, start_time in zip(transpiled_qc.data, transpiled_qc.op_start_times):
print(f"{instruction.operation.name}: {start_time}")Original circuit:
┌───┐ ░ ┌─┐
q_0: ┤ H ├──■───░─┤M├───
└───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
└───┘ ░ ║ └╥┘
meas: 2/══════════════╩══╩═
0 1
Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:
┌─────────┐ ░ ┌─────────────────┐┌─┐
q_0 -> 0 ───┤ U2(0,π) ├──────■───░─┤ Delay(1255[dt]) ├┤M├
┌──┴─────────┴───┐┌─┴─┐ ░ └───────┬─┬───────┘└╥┘
q_1 -> 1 ┤ Delay(196[dt]) ├┤ X ├─░─────────┤M├─────────╫─
└────────────────┘└───┘ ░ └╥┘ ║
meas: 2/═══════════════════════════════════╩══════════╩═
1 0
Start times of instructions in the transpiled circuit:
u2: 0
delay: 0
cx: 196
barrier: 2098
delay: 2098
measure: 3353
measure: 2098Devuelve
Lista de enteros que representan las horas estimadas de inicio de las instrucciones. El índice corresponde al índice de instrucción en QuantumCircuit.data.
Eleva
AttributeError : cuando el circuito no está programado.
Por último, QuantumCircuit expone varias propiedades simples como atributos numéricos dinámicos de sólo lectura.
num_ancillas
Devuelve el número de qubits ancilla.
Ejemplo
from qiskit import QuantumCircuit, QuantumRegister, AncillaRegister
# Create a 2-qubit quantum circuit
reg = QuantumRegister(2)
qc = QuantumCircuit(reg)
# Create an ancilla register with 1 qubit
anc = AncillaRegister(1)
qc.add_register(anc) # Add the ancilla register to the circuit
print("Number of ancilla qubits:", qc.num_ancillas)Number of ancilla qubits: 1num_clbits
Devuelve el número de bits clásicos.
Ejemplo
from qiskit import QuantumCircuit
# Create a new circuit with two qubits and one classical bit
qc = QuantumCircuit(2, 1)
print("Number of classical bits:", qc.num_clbits)Number of classical bits: 1num_captured_vars
El número de variables clásicas en tiempo real en el circuito marcadas como capturadas desde un ámbito envolvente.
Es la longitud del iter_captured_vars() iterable. Si es distinto de cero, num_input_vars debe ser cero.
num_captured_stretches
El número de tramos en el circuito marcados como capturados desde un ámbito envolvente.
Es la longitud del iter_captured_stretches() iterable. Si es distinto de cero, num_input_vars debe ser cero.
num_declared_vars
El número de variables clásicas en tiempo real en el circuito que son declaradas por este ámbito de circuito, excluyendo entradas o capturas.
Es la longitud del iter_declared_vars() iterable.
num_declared_stretches
El número de tramos en el circuito que son declarados por este ámbito de circuito, excluyendo las capturas.
Es la longitud del iter_declared_stretches() iterable.
num_input_vars
Número de variables clásicas en tiempo real del circuito marcadas como entradas del circuito.
Es la longitud del iter_input_vars() iterable. Si es distinto de cero, num_captured_vars debe ser cero.
num_identifiers
El número de variables clásicas en tiempo real y tramos en el circuito.
Esto es igual a num_vars() + num_stretches().
num_parameters
Número de objetos parámetro en el circuito.
num_qubits
Devuelve el número de qubits.
num_stretches
El número de tramos del circuito.
Es la longitud del iter_stretches() iterable.
num_vars
El número de variables clásicas en tiempo real del circuito.
Es la longitud del iter_vars() iterable.
Creación de nuevos circuitos
Método | Resumen |
|---|---|
__init__() | Constructor por defecto de circuitos sin instrucciones. |
copy() | Haga una copia completa de un circuito existente. |
copy_empty_like() | Copia objetos de datos de un circuito a otro nuevo sin instrucciones. |
from_circuit_data() | Recrear a partir del objeto _data nativo de Rust. |
from_instructions() | Inferir los objetos de datos necesarios a partir de una lista de instrucciones. |
from_qasm_file() | Interfaz heredada para qasm2.load(). |
from_qasm_str() | Interfaz heredada para qasm2.loads(). |
El constructor por defecto (QuantumCircuit(...)) produce un circuito sin instrucciones iniciales. Los argumentos del constructor por defecto se pueden utilizar para sembrar el circuito con almacenamiento de datos cuánticos y clásicos, y para proporcionar un nombre, fase global y metadatos arbitrarios. Todos estos campos pueden ampliarse posteriormente.
__init__
__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Constructor por defecto de QuantumCircuit.
Parámetros
-
regs (Register |int |Sequence[Bit]) –
Los registros que se incluirán en el circuito.
-
Si una lista de
Registerobjetos, representa elQuantumRegistery/oClassicalRegisterobjetos a incluir en el circuito.Por ejemplo:
QuantumCircuit(QuantumRegister(4))QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
-
Si es una lista de
int, la cantidad de qubits y/o bits clásicos a incluir en el circuito. Puede ser un único int para sólo el número de bits cuánticos, o 2 ints para el número de bits cuánticos y bits clásicos, respectivamente.Por ejemplo:
QuantumCircuit(4) # A QuantumCircuit with 4 qubitsQuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
-
Si una lista de listas python contiene
Bituna colección de objetosBits que se añadirán al circuito.
-
-
name (str | None) – : el nombre del circuito cuántico. Si no se especifica, se asignará una cadena generada automáticamente.
-
global_phase (ParameterExpression |float) – La fase global del circuito en radianes.
-
metadata (dict | None) – Metadatos con valores de clave arbitrarios para asociar al circuito. Esto se almacena como datos de formato libre en un diccionario dentro del atributo
metadata. No se utilizará directamente en el circuito. -
inputs (Iterable[Var]) – No hay variables que declarar como variables
inputde tiempo de ejecución para este circuito. Estos deberían ser nodos yaexpr.Varexistentes que hayas creado en otro lugar; si también necesitas crear las entradas, utilizaQuantumCircuit.add_input(). Las variables proporcionadas en este argumento se pasarán directamente aadd_input(). Un circuito no puede tener tantoinputscomocaptures. -
captures (Iterable[Var |Stretch]) – cualquier variable que este ámbito de circuito deba heredar de un ámbito superior. Las variables que se indican aquí se pasarán directamente a
add_capture(). Un circuito no puede tener tantoinputscomocaptures. -
declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –
cualquier variable que este circuito deba declarar e inicializar inmediatamente. Puede ordenar esta entrada de modo que las declaraciones posteriores dependan de las anteriores (incluidas las entradas o capturas). Si necesita depender de valores que se calcularán posteriormente en tiempo de ejecución, utilice
add_var()en un punto apropiado de la ejecución del circuito.Este argumento está pensado para la inicialización conveniente del circuito cuando ya se tiene un conjunto de variables creadas. Las variables utilizadas aquí se pasarán directamente a
add_var()que puede utilizar directamente si es la primera vez que crea la variable.
Eleva
- CircuitError - si el nombre del circuito no es válido.
- CircuitError - si se indican
inputsycaptures.
Si ya dispone de un circuito, puede realizar una copia del mismo utilizando copy()con todas sus instrucciones. Esto es útil si quieres mantener circuitos parciales mientras extiendes otro, o para tener una versión que puedas mutar in situ mientras dejas la anterior intacta.
copy
copy(name=None)
Copia el circuito.
Parámetros
name (str) – : nombre que se le dará al circuito copiado. Si es «None», el nombre se mantiene igual.
Devuelve
una copia profunda del circuito actual, con el nombre especificado
Tipo de retorno
Del mismo modo, si quieres un circuito que contenga todos los mismos objetos de datos (bits, registros, variables, etc.), pero sin ninguna de las instrucciones, puedes utilizar copy_empty_like(). Esto es bastante habitual cuando se quiere crear una nueva capa de un circuito para luego aplicarla en la parte posterior con compose(), o para reescribir por completo las instrucciones de un circuito.
copy_empty_like
copy_empty_like(name=None, *, vars_mode='alike')
Devuelve una copia de self con la misma estructura pero vacía.
Esa estructura incluye:
- nombre y otros metadatos
- fase global
- todos los qubits y clbits, incluidos los registros
- las variables de tiempo real definidas en el circuito, tratadas según el argumento de la palabra clave
vars.
Si el circuito contiene alguna declaración de variable local (las añadidas por el argumento declarations al constructor del circuito, o utilizando add_var()), puede que no estén inicializadas en el circuito de salida. Tendrá que añadir manualmente instrucciones de almacenamiento para ellos (véase Store y QuantumCircuit.store()) para inicializarlos.
Parámetros
-
name (str | None) – Nombre del circuito copiado. Si es «None», el nombre se mantiene igual.
-
vars_mode (Literal['alike', 'captures', 'drop']) –
El modo para manejar las variables en tiempo real.
igual
Las variables del circuito de salida tendrán la misma semántica de declaración que en el circuito original. Por ejemplo, las variables
inputen la fuente serán variablesinputen el circuito de salida. Tenga en cuenta que esto provoca que las variables locales no se inicialicen, porque los almacenes no se copian. Esto puede dejar el circuito en un estado potencialmente peligroso para los usuarios si no vuelven a añadir los almacenes inicializadores.capturas
Todas las variables se convertirán en variables capturadas. Esto es útil cuando se está construyendo una nueva capa para un circuito existente que querrá
compose()en la base, ya quecompose()puede incluir capturas en el circuito base (pero no otras variables).descartar
El circuito de salida no tendrá variables definidas.
Devuelve
Una copia vacía de sí mismo.
Tipo de retorno
En algunos casos, lo más conveniente es generar una lista de CircuitInstructions por separado, al margen del contexto completo del circuito, y a continuación construir un circuito a partir de ella. El from_instructions() constructor capturará automáticamente todas Qubit las instancias de y Clbit utilizadas en las instrucciones y creará un nuevo QuantumCircuit objeto que cuente con los recursos adecuados y todas las instrucciones.
from_instructions
static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)
Construye un circuito a partir de un iterable de CircuitInstructions.
Parámetros
- instructions (Iterable[CircuitInstruction |tuple[qiskit.circuit.Instruction] | tuple[qiskit.circuit.Instruction, Iterable[Qubit]] | tuple[qiskit.circuit.Instruction, Iterable[Qubit], Iterable[Clbit]]]) – Las instrucciones que hay que añadir al circuito.
- qubits (Iterable[Qubit]) – Cualquier qubits para añadir al circuito. Este argumento puede utilizarse, por ejemplo, para imponer un orden determinado de los qubits.
- clbits (Iterable[Clbit]) – Cualquier bit clásico para añadir al circuito. Este argumento puede utilizarse, por ejemplo, para imponer un orden determinado de los bits clásicos.
- name (str | None) – El nombre del circuito.
- global_phase (ParameterValueType) – La fase global del circuito en radianes.
- metadata (dict | None) – Metadatos con valores de clave arbitrarios para asociar al circuito.
Devuelve
El circuito cuántico.
Tipo de retorno
Si estás interactuando con código C o código nativo, es posible que necesites acceder a los datos internos subyacentes en QuantumCircuit._data. Puedes recrear el circuito completo utilizando from_circuit_data().
from_circuit_data
static from_circuit_data(data, /, *, name=None, metadata=None)
Construye un circuito a partir de un objeto opaco CircuitData.
Normalmente, esta función se utiliza para envolver un objeto procedente de C en una clase QuantumCircuit completa de Python. El objeto CircuitData es el objeto nativo de Rust que se corresponde con el objeto de la API de C QkCircuit. Consulta su documentación para obtener más detalles sobre este objeto opaco.
La inversa de esta función es el atributo _data .
Parámetros
- data (CircuitData) – el objeto nativo que contiene el circuito IR.
- name (str | None) – : un nombre opcional, exclusivo de Python, que se aplicará al circuito.
- metadata (dict | None) – : metadatos opcionales, arbitrarios y exclusivos de Python que se pueden adjuntar al circuito.
Devuelve
Un objeto de circuito completo.
Tipo de retorno
QuantumCircuit también tiene dos métodos constructores que son envoltorios heredados de los importadores en qiskit.qasm2. Estos aplican automáticamente la configuración de compatibilidad heredada de load() y loads().
from_qasm_file
static from_qasm_file(path)
Leer un programa OpenQASM 2.0 de un archivo y convertirlo en una instancia de QuantumCircuit.
Parámetros
path (str |PathLike) – Ruta al archivo de un programa de OpenQASM 2
Devuelve
El objeto QuantumCircuit para la entrada OpenQASM 2.
Tipo de retorno
qasm2.load(): la interfaz completa del importador OpenQASM 2.
from_qasm_str
static from_qasm_str(qasm_str)
Convierte una cadena que contiene un programa OpenQASM 2.0 en un programa QuantumCircuit.
Parámetros
qasm_str (str) – Una cadena que contiene un programa de OpenQASM2.0.
Devuelve
El objeto QuantumCircuit para la entrada OpenQASM 2
Tipo de retorno
qasm2.loads(): la interfaz completa del importador OpenQASM 2.
Objetos de datos en circuitos
Añadir objetos de datos
Método | Añade este tipo de datos |
|---|---|
add_bits() | Qubits y Clbits. |
add_register() | QuantumRegister y ClassicalRegister. |
add_var() | Var nodos con ámbito local e inicializadores. |
add_stretch() | Stretch nodos de ámbito local. |
add_input() | Var nodos que se tratan como entradas del circuito. |
add_capture() | Var o Stretch nodos capturados de ámbitos contenedores. |
add_uninitialized_var() | Var nodos con ámbito local y estado indefinido. |
Normalmente se añaden la mayoría de los objetos de datos (Qubit, Clbit, ClassicalRegisteretc) al circuito como parte del uso del constructor por defecto __init__() constructor por defecto, o copy_empty_like(). No obstante, también es posible añadirlas posteriormente. Los datos clásicos tipificados, como los nodos autónomos Var (véase Cálculo clásico en tiempo real ), pueden construirse y añadirse con métodos independientes.
Nuevo sin registro Qubit y Clbit se añaden mediante add_bits(). Estos objetos no deben estar ya presentes en el circuito. Puede comprobar si ya existe un bit en el circuito utilizando find_bit().
add_bits
Los registros se añaden al circuito con add_register(). En este método, no es un error si algunos de los bits ya están presentes en el circuito. En este caso, el registro será un "alias" sobre los bits. Esto no suele estar bien soportado por los backends de hardware; probablemente sea mejor no depender de ello. Los registros en los que se encuentra un bit determinado forman parte del retorno de find_bit().
add_register
add_register(*regs)
Añade registros.
Si el circuito cuántico tiene un atributo layout añadir un atributo QuantumRegister sólo aumentará el número de qubits. No actualizará el diseño.
Parámetros
regs (Register |int |Sequence[Bit])
Tipo de retorno
Ninguna
Los datos clásicos tipificados en tiempo real se representan en el circuito mediante Var nodos con un Type. Es posible instanciarlas por separado en un circuito (véase Var.new()), pero a menudo es más conveniente utilizar métodos de circuito que gestionen automáticamente los tipos y la inicialización de expresiones por ti. Los dos métodos más comunes son add_var() (variables de ámbito local) y add_input() (entradas al circuito). Además, el método add_stretch() puede utilizarse para añadir tramos al circuito.
add_var
add_var(name_or_var, /, initial)
Añade a este circuito una variable clásica con almacenamiento automático y alcance.
La variable se considera "declarada" al principio del circuito, pero sólo se inicializa en el punto del circuito en que se llama a este método, por lo que puede depender de variables definidas antes que ella.
Parámetros
-
name_or_var (str |Var) – : o bien una cadena con el nombre de la variable, o bien una instancia existente de
Varque se vaya a reutilizar. Las variables no pueden ocultar nombres que ya estén en uso dentro del circuito. -
initial (Any) –
el valor con el que inicializar esta variable. Si el primer argumento se ha dado como nombre de cadena, el tipo de la variable resultante se deduce de la expresión inicial; para controlar esto de forma más manual, utilice
Var.new()para construir manualmente una nueva variable con el tipo deseado, o utiliceexpr.cast()para convertir el inicializador al tipo deseado.Debe ser un nodo
Expro un valor que se puede elevar a uno medianteexpr.lift.
Devuelve
La variable creada. Si se ha dado una Var se devolverá exactamente el mismo objeto.
Eleva
CircuitError - si la variable no puede crearse debido a la sombra de un identificador existente.
Tipo de retorno
Ejemplos
Define una nueva variable con un nombre y una expresión inicializadora:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)Reutilizar una variable que puede haber sido tomada de un circuito relacionado, o construida manualmente de otro modo, e inicializarla con alguna expresión más complicada:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.classical import expr, types
my_var = expr.Var.new("my_var", types.Uint(8))
cr1 = ClassicalRegister(8, "cr1")
cr2 = ClassicalRegister(8, "cr2")
qc = QuantumCircuit(QuantumRegister(8), cr1, cr2)
# Get some measurement results into each register.
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr1)
qc.reset(range(8))
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr2)
# Now when we add the variable, it is initialized using the real-time state of the
# two classical registers we measured into above.
qc.add_var(my_var, expr.bit_and(cr1, cr2))add_input
add_input(name_or_var: str, type_: Type, /) → Var
add_input(name_or_var: Var, type_: None = None, /) → Var
Registra una variable como entrada al circuito.
Parámetros
- name_or_var (str |Var) – : un nombre de cadena o un nodo
Varexistente que se utilizará como variable de entrada. - tipo - si el nombre se da como una cadena, entonces este debe ser un
Typepara la variable. Si la variable se da como unVarno debe indicarse, sino que se leerá del propio objeto. - type_ (Type | None)
Devuelve
la variable creada, o la misma variable que se pasó.
Eleva
CircuitError - si la variable no puede crearse debido a la sombra de una variable existente.
Tipo de retorno
add_stretch
add_stretch(name_or_stretch)
Declara un nuevo tramo para este circuito.
Parámetros
name_or_stretch (str |Stretch) – : o bien una cadena con el nombre del tramo, o bien una instancia ya existente que se vaya a Stretch reutilizar. Los nombres «Stretches» no pueden solaparse con nombres que ya estén en uso dentro del circuito.
Devuelve
El tramo creado. Si se ha dado una Stretch se devolverá exactamente el mismo objeto.
Eleva
CircuitError - si el tramo no puede crearse debido a la sombra de un identificador existente.
Tipo de retorno
Ejemplos
Definir y utilizar un nuevo tramo dado sólo un nombre:
from qiskit.circuit import QuantumCircuit, Duration
from qiskit.circuit.classical import expr
qc = QuantumCircuit(2)
my_stretch = qc.add_stretch("my_stretch")
qc.delay(expr.add(Duration.dt(200), my_stretch), 1)Además, existen dos métodos de nivel inferior que pueden ser útiles para la generación programática de circuitos. Cuando trabaje de forma interactiva, lo más probable es que no los necesite; la mayoría de los usos de add_uninitialized_var() forman parte de copy_empty_like()y la mayoría de los usos de add_capture() sería mejor utilizar la interfaz del constructor de flujo de control.
add_uninitialized_var
add_uninitialized_var(var, /)
Añade una variable sin inicializador.
En la mayoría de los casos, debe utilizar add_var() para inicializar la variable. Para utilizar esta función, debe tener ya una instancia Var ya que el uso de esta función sólo tiene sentido en contextos de copia.
Qiskit no hace afirmaciones acerca de lo que una variable no inicializada se evaluará en tiempo de ejecución, y algunos hardware puede rechazar esto como un error.
Debe tratar esta función con precaución, y como una primitiva de bajo nivel que sólo es útil en casos especiales de reconstrucción programática de dos circuitos similares.
Parámetros
var (Var) – la variable a añadir.
add_capture
add_capture(var: Var)
add_capture(stretch: Stretch)
Añade un identificador al circuito que debe capturar de un ámbito en el que estará contenido.
Este método requiere un Var o Stretch para asegurar que tiene un "handle" a un identificador, porque necesitará declarar el mismo identificador usando el mismo objeto en el circuito externo.
Se trata de un método de bajo nivel, que sólo es realmente útil si está construyendo manualmente operaciones de flujo de control. Normalmente no necesitará llamar a este método, asumiendo que está utilizando la interfaz del constructor para ámbitos de flujo de control (with context-manager statements for if_test() y otras construcciones de ámbito). La interfaz del constructor hará automáticamente los cierres de los ámbitos internos en su nombre capturando cualquier identificador que se utilice dentro de ellos.
Parámetros
var (Union[expr.Var, expr.Stretch]) – la variable o tramo a capturar desde un ámbito envolvente.
Eleva
CircuitError - si el identificador no puede crearse debido a la sombra de un identificador existente.
Trabajar con bits y registros
Una Bit instancia es, en sí misma, simplemente un identificador único que los circuitos pueden utilizar en sus propios contextos. Si dispones de una Bit instancia y un circuito, puedes averiguar en qué contextos se encuentra el bit, find_bit() como su índice entero en el circuito y los registros en los que está contenido.
find_bit
find_bit(bit)
Encontrar lugares en el circuito que puedan utilizarse para referenciar un determinado Bit.
En particular, esta función puede encontrar el índice entero de un qubit, que corresponde a su índice hardware para un circuito transpilado.
El índice de circuito de un AncillaQubit será su índice en qubitsy no ancillas.
Parámetros
bit (Bit) – El bit a localizar.
Devuelve
Una 2-tupla. El primer elemento (index) contiene el índice en el que se encuentra Bit (en qubits, clbitsen función de su tipo). El segundo elemento (registers) es una lista de pares (register, index) con una entrada para cada Register del circuito que contiene el Bit (y el índice en el Register en el que puede encontrarse).
Tipo de retorno
namedtuple( int, List[Tuple( Register, int )])
Eleva
- CircuitError - Si el
Bites de tipo desconocido. - CircuitError - Si el
Biten el circuito.
Ejemplos
Recorre en bucle un circuito, obteniendo los índices qubit y clbit de cada operación:
from qiskit.circuit import QuantumCircuit, Qubit
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])
# The `.qubits` and `.clbits` fields are not integers.
assert isinstance(qc.data[0].qubits[0], Qubit)
# ... but we can use `find_bit` to retrieve them.
assert qc.find_bit(qc.data[0].qubits[0]).index == 0
simple = [
(
instruction.operation.name,
[qc.find_bit(bit).index for bit in instruction.qubits],
[qc.find_bit(bit).index for bit in instruction.clbits],
)
for instruction in qc.data
]Del mismo modo, puede consultar un circuito para ver si ya se le ha añadido un registro utilizando has_register().
has_register
has_register(register)
Comprueba si este circuito tiene el registro r.
Parámetros
register (Register) – un registro cuántico o clásico.
Devuelve
Verdadero si el registro está contenido en este circuito.
Tipo de retorno
Trabajar con parámetros en tiempo de compilación
Parametrización en tiempo de compilación
Una discusión más completa de lo que es la parametrización en tiempo de compilación, y cómo encaja en el modelo de datos de Qiskit.
A diferencia de los bits, registros y datos clásicos tipados en tiempo real, los parámetros simbólicos en tiempo de compilación no se añaden manualmente a un circuito. Su presencia se infiere por estar contenidos en operaciones añadidas a circuitos y a la fase global. Una lista ordenada de todos los parámetros actualmente en un circuito se encuentra en QuantumCircuit.parameters.
La operación más habitual con Parameter las instancias consiste en sustituirlas, en operaciones simbólicas, por un valor numérico o por otra expresión simbólica. Esto se hace con assign_parameters().
assign_parameters
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[False] = False, *, flat_input: bool = False, strict: bool = True) → QuantumCircuit
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[True] = False, *, flat_input: bool = False, strict: bool = True) → None
Asignar parámetros a nuevos parámetros o valores.
Si parameters se pasa como un diccionario, las claves deben ser Parameter instancias del circuito actual. Los valores del diccionario pueden ser valores numéricos o nuevos objetos de parámetro.
Si parameters se pasa como una lista o una matriz, los elementos se asignan a los parámetros actuales en el orden de parameters , que está ordenado alfabéticamente (respetando el orden de ParameterVector los objetos de ).
Los valores pueden asignarse al objeto circuito actual o a una copia del mismo.
Cuando parameters se define como una función de correspondencia, se permite que las claves sean cadenas que contengan los nombres de los parámetros; estas se buscarán utilizando get_parameter(). También puedes tener claves que sean ParameterVector instancias y, en ese caso, el valor del diccionario debe ser una secuencia de valores de la misma longitud que el vector.
flat_input=FalseSi utilizas cualquiera de estos casos, debes dejar la configuración tal cual; si la cambias, True se activará la ruta rápida, en la que todas las claves deben ser Parameter instancias.
Parámetros
- parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – Un diccionario o un iterable que especifique los nuevos valores de los parámetros.
- inplace (bool) – Si el valor es «False», se devuelve una copia del circuito con los parámetros vinculados. Si el valor es «True», se modifica la propia instancia del circuito.
- flat_input (bool) – Si y
Trueesparametersun tipo de aplicación, se supone que es exactamente una aplicación de{parameter: value}. Por defecto (False), la asignación también puede contenerParameterVectorclaves que apunten a una secuencia correspondiente de valores, las cuales se desarrollarán durante la asignación, o claves de cadena, que se convertirán en instanciasParametermedianteget_parameter(). - strict (bool) – Si
False, se ignorarán los parámetros especificados en la asignación que no se utilicen en el circuito. Si (Truevalor predeterminado), se generará un error que indicará un error lógico.
Eleva
- CircuitError - Si parameters es un dict y contiene parámetros no presentes en el circuito.
- ValueError : si «parameters» es una lista o un array y su longitud no coincide con el número de parámetros libres del circuito.
Devuelve
Una copia del circuito con parámetros vinculados si inplace es False, en caso contrario None.
Tipo de retorno
QuantumCircuit | Ninguno
Ejemplos
Cree un circuito parametrizado y asigne los parámetros in situ.
from qiskit.circuit import QuantumCircuit, Parameter
circuit = QuantumCircuit(2)
params = [Parameter('A'), Parameter('B'), Parameter('C')]
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
circuit.draw('mpl')
circuit.assign_parameters({params[0]: params[2]}, inplace=True)
circuit.draw('mpl')

Une los valores fuera de lugar por lista y obtén una copia del circuito original.
from qiskit.circuit import QuantumCircuit, ParameterVector
circuit = QuantumCircuit(2)
params = ParameterVector('P', 2)
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
bound_circuit = circuit.assign_parameters([1, 2])
bound_circuit.draw('mpl')
circuit.draw('mpl')

El circuito realiza el seguimiento de los parámetros a través de Parameter las propias instancias y no permite que haya varios parámetros con el mismo nombre, con el fin de evitar ciertos problemas a la hora de interoperar con OpenQASM u otros formatos externos. Puedes utilizar has_parameter() y get_parameter() para consultar el circuito en busca de un parámetro con el nombre de cadena indicado.
has_parameter
has_parameter(name_or_param, /)
Comprueba si existe un objeto parámetro en este circuito.
Parámetros
name_or_param (str |Parameter) – : el parámetro o el nombre del parámetro que se va a comprobar. Si se trata de un nodo Parameter , el parámetro debe ser exactamente el indicado para que esta función devuelva True.
Devuelve
si un parámetro de coincidencia es asignable en este circuito.
Tipo de retorno
QuantumCircuit.get_parameter()
Recupera la Parameter instancia de este circuito por su nombre.
ParameterUn método similar a este, pero para variables de tiempo expr.Var de ejecución en lugar de variables de tiempo de compilación.
get_parameter
get_parameter(name: str, default: T) → Parameter | T
get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter
Recupera un parámetro en tiempo de compilación accesible en este ámbito de circuito por su nombre.
Parámetros
- name (str) – : el nombre del parámetro que se va a recuperar.
- default (Any) – : si se proporciona, se devolverá este valor en caso de que el parámetro no esté presente. Si no se especifica,
KeyErrorse genera un en su lugar.
Devuelve
El parámetro correspondiente.
Eleva
KeyError : si no se ha especificado ningún valor por defecto, pero el parámetro no existe en el circuito.
Tipo de retorno
Ejemplos
Recuperar un parámetro de un circuito por su nombre:
from qiskit.circuit import QuantumCircuit, Parameter
my_param = Parameter("my_param")
# Create a parametrized circuit.
qc = QuantumCircuit(1)
qc.rx(my_param, 0)
# We can use 'my_param' as a parameter, but let's say we've lost the Python object
# and need to retrieve it.
my_param_again = qc.get_parameter("my_param")
assert my_param == my_param_againObtiene una variable de un circuito por su nombre, devolviendo algún valor por defecto si no está presente:
assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is NoneTrabajar con datos clásicos escritos en tiempo real
Documentación a nivel de módulo sobre el funcionamiento de los sistemas de variables, expresiones y tipos, los objetos utilizados para representarlos y las operaciones clásicas disponibles.
Cálculo clásico en tiempo real
Un debate sobre cómo encajan los datos en tiempo real en el conjunto del qiskit.circuit modelo de datos en su conjunto.
Los métodos para añadir nuevos Var o Stretch identificadores a un circuito después de la inicialización.
Puede recuperar identificadores adjuntos a un circuito (por ejemplo, un Var o Stretch) por nombre con los métodos get_var(), get_stretch()o get_identifier(). También puede comprobar si un circuito contiene un identificador dado con has_var(), has_stretch()o has_identifier().
get_var
get_var(name: str, default: T) → Var | T
get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var
Recupera una variable accesible en este ámbito de circuito por su nombre.
Parámetros
- name (str) – : el nombre de la variable que se va a recuperar.
- default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica,
KeyErrorse genera un en su lugar.
Devuelve
La variable correspondiente.
Eleva
KeyError : si no se ha especificado ningún valor por defecto, pero la variable no existe.
Ejemplos
Recuperar una variable por su nombre de un circuito:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_var = qc.add_var("my_var", False)
# We can use 'my_var' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_var_again = qc.get_var("my_var")
assert my_var == my_var_againObtiene una variable de un circuito por su nombre, devolviendo algún valor por defecto si no está presente:
assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is Noneget_stretch
get_stretch(name: str, default: T) → Stretch | T
get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch
Recupera un tramo accesible en este ámbito de circuito por su nombre.
Parámetros
- name (str) – : el nombre del tramo que se desea recuperar.
- default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica,
KeyErrorse genera un en su lugar.
Devuelve
El tramo correspondiente.
Eleva
KeyError : si no se ha especificado ningún valor por defecto, pero la variable no existe.
Ejemplos
Recuperar un tramo por su nombre de un circuito:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_stretch = qc.add_stretch("my_stretch")
# We can use 'my_stretch' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_stretch_again = qc.get_stretch("my_stretch")
assert my_stretch == my_stretch_againObtiene una variable de un circuito por su nombre, devolviendo algún valor por defecto si no está presente:
assert qc.get_stretch("my_stretch", None) == my_stretch
assert qc.get_stretch("unknown_stretch", None) is Noneget_identifier
get_identifier(name: str, default: T) → Var | Stretch | T
get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch
Recupera un identificador accesible en este ámbito de circuito por su nombre.
Esto incluye actualmente tanto las variables clásicas en tiempo real como los tramos.
Parámetros
- name (str) – : el nombre del identificador que se desea recuperar.
- default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica,
KeyErrorse genera un en su lugar.
Devuelve
La variable correspondiente.
Eleva
KeyError : si no se ha especificado ningún valor por defecto, pero el identificador no existe.
Obtiene un identificador conocido como expr.Var instancia.
Obtiene un identificador conocido como expr.Stretch instancia.
Un método similar, pero para Parameter parámetros de tiempo de compilación en lugar de expr.Var variables de tiempo de ejecución.
has_var
has_var(name_or_var, /)
Comprueba si una variable es accesible en este ámbito.
Parámetros
name_or_var (str |Var) – : la variable o el nombre de la variable que se va a comprobar. Si se trata de un expr.Var nodo, la variable debe ser exactamente la indicada para que esta función devuelva True.
Devuelve
si una variable coincidente es accesible.
Tipo de retorno
Recupera la expr.Var instancia de este circuito por su nombre.
QuantumCircuit.has_parameter()
ParameterUn método similar a este, pero para variables de tiempo de compilación en lugar de variables de tiempo expr.Var de ejecución.
has_stretch
has_stretch(name_or_stretch, /)
Comprueba si un tramo es accesible en este ámbito.
Parámetros
name_or_stretch (str |Stretch) – el tramo, o el nombre del tramo que se va a comprobar. Si se trata de un nodo expr.Stretch , el estiramiento debe ser exactamente el indicado para que esta función devuelva True.
Devuelve
si un tramo coincidente es accesible.
Tipo de retorno
Recupera la expr.Stretch instancia de este circuito por su nombre.
has_identifier
has_identifier(name_or_ident, /)
Comprueba si un identificador es accesible en este ámbito.
Parámetros
name_or_ident (str |Var |Stretch) – : la instancia o el nombre del identificador que se va a comprobar. Si se trata de un expr.Stretch nodo o expr.Var , la instancia coincidente debe ser exactamente la indicada para que esta función devuelva True.
Devuelve
si un identificador coincidente es accesible.
Tipo de retorno
QuantumCircuit.get_identifier()
Recuperar el expr.Var o expr.Stretch de este circuito por su nombre.
Igual que este método, pero ignorando todo lo que no sea una variable en tiempo de ejecución expr.Var .
Igual que este método, pero ignorando todo lo que no sea una variable en tiempo de ejecución expr.Stretch .
QuantumCircuit.has_parameter()
ParameterUn método similar a este, pero para variables de tiempo de compilación en lugar de variables de tiempo expr.Var de ejecución.
También hay varios métodos iteradores que puedes utilizar para obtener el conjunto completo de identificadores rastreados por un circuito. Al menos uno de iter_input_vars() y iter_captured_vars() estará vacío, ya que las entradas y las capturas se excluyen mutuamente. Todos los iteradores tienen sus correspondientes propiedades dinámicas en QuantumCircuit que contienen su longitud: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_varso num_declared_stretches.
iter_vars
iter_vars()
Obtiene un iterable sobre todas las variables clásicas en tiempo real en el ámbito de este circuito.
Este método iterará sobre todas las variables del ámbito. Para iteradores más precisos, véase iter_declared_vars(), iter_input_vars() y iter_captured_vars().
Tipo de retorno
iter_stretches
iter_stretches()
Obtener un iterable sobre todos los tramos en el ámbito dentro de este circuito.
Este método iterará sobre todos los tramos del ámbito. Para iteradores más precisos, véase iter_declared_stretches() y iter_captured_stretches().
Tipo de retorno
iter_input_vars
iter_input_vars()
Obtiene un iterable sobre todas las variables clásicas en tiempo real que se declaran como entradas de este ámbito de circuito. Esto excluye las variables declaradas localmente (véase iter_declared_vars()) y las variables capturadas (véase iter_captured_vars()).
Tipo de retorno
iter_captured_vars
iter_captured_vars()
Obtiene un iterable sobre todas las variables clásicas en tiempo real que son capturadas por este ámbito de circuito desde un ámbito contenedor. Esto excluye las variables de entrada (véase iter_input_vars()) y las variables declaradas localmente (véase iter_declared_vars()).
Tipo de retorno
iter_captured_stretches
iter_captured_stretches()
Obtiene un iterable sobre tramos que son capturados por este ámbito de circuito desde un ámbito contenedor. Esto excluye los tramos declarados localmente (véase iter_declared_stretches()).
Tipo de retorno
iter_declared_vars
iter_declared_vars()
Obtiene un iterable sobre todas las variables clásicas en tiempo real que se declaran con duración de almacenamiento automático en este ámbito. Esto excluye las variables de entrada (véase iter_input_vars()) y las variables capturadas (véase iter_captured_vars()).
Tipo de retorno
iter_declared_stretches
iter_declared_stretches()
Obtiene un iterable sobre todos los tramos declarados en este ámbito. Esto excluye los tramos capturados (véase iter_captured_stretches()).
Tipo de retorno
Añadir operaciones a los circuitos
Puedes añadir cualquier elemento que implemente la Operation interfaz a un circuito mediante una sola instrucción, aunque la mayoría de los elementos que querrás añadir serán instancias de Instruction o Gate .
Operaciones, instrucciones y puertas
La página qiskit.circuit-documentación de nivel sobre las diferentes interfaces que utiliza Qiskit para definir instrucciones a nivel de circuito.
Métodos para añadir operaciones generales
Estos son los métodos base que se encargan de añadir cualquier objeto, incluidos los definidos por el usuario, a los circuitos.
Método | Cuándo utilizarlo |
|---|---|
append() | Añade una instrucción como objeto individual a un circuito. |
_append() | Igual que append()pero con una interfaz de bajo nivel que elude casi toda comprobación de errores. |
compose() | Inserta las instrucciones de un circuito en otro. |
tensor() | Como compose()pero estrictamente para unir circuitos que actúan sobre qubits disjuntos. |
QuantumCircuit tiene dos formas principales de añadir más operaciones a un circuito. La elección depende de si desea añadir el objeto como una única "instrucción" (append()), o si desea unir las instrucciones de dos circuitos (compose()).
Una instrucción u operación aparece como una sola entrada en el data del circuito y como un único recuadro cuando se dibuja en los visualizadores de circuitos (véase draw()). Una instrucción es la «unidad» en función de la cual se puede definir un backend de hardware (véase Target). Un Instruction puede ir acompañado de un definition, que es una regla a la que el transpilador (véase qiskit.transpiler) podrá recurrir para descomponerlo para el hardware, si fuera necesario. Un Operation que no sea también un Instruction solo puede descomponerse si tiene registrado algún método de síntesis de alto nivel asociado (véase qiskit.transpiler.passes.synthesis.plugin).
Una QuantumCircuit por sí sola no es un simple Instruction; es más bien algo más complejo, ya que, en general, puede representar un programa completo con entradas y salidas de memoria clásicas tipadas, así como flujo de control. El modelo de datos de Qiskit (y del mayor parte del hardware) aún no incluye el concepto de subrutinas reutilizables y ejecutables con operandos cuánticos virtuales. Se pueden convertir circuitos simples que actúan únicamente sobre qubits mediante operaciones unitarias en un Gate utilizando to_gate(), y circuitos simples que actúan únicamente sobre qubits y clbits en un Instruction utilizando to_instruction().
Cuando tengas un Operation, Instruction, o Gate, añádelo al circuito, especificando los argumentos «qubit» y «clbit» con append().
append
append(instruction, qargs=None, cargs=None, *, copy=True)
Añadir una o más instrucciones al final del circuito, modificando el circuito en su lugar.
InstructionLos elementos qargs y cargs se ampliarán y se transmitirán de acuerdo con las reglas del dado, y cualquier elemento que no seaBit un especificador (como los índices enteros) se resolverá en las instancias pertinentes.
Si se proporciona un CircuitInstruction , se descomprimirá, se verificará en el contexto de este circuito y se añadirá un nuevo objeto al circuito. En este caso, no puedes pasar qargs ni cargs por separado.
Parámetros
- instruction (Operation |CircuitInstruction) –
Instructioninstancia a la que añadir, o unCircuitInstructioncon todo su contexto. También se admiten los objetos que implementanto_instruction, pero por lo general es preferible pasar unInstructiondirectamente, ya que así se evita el coste de las conversiones repetidas. - Especificadores qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – de los
Qubit«s» a los que se va a adjuntar la instrucción. - Especificadores cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – de los
Clbit«s» a los que se va a adjuntar la instrucción. - copy (bool) – si (
Truepor defecto), entonces el valor entranteinstructionse copia antes de añadirlo al circuito si contiene parámetros simbólicos, de modo que pueda modificarse con seguridad sin afectar a otros circuitos en los que pueda encontrarse la misma instrucción. Si estás seguro de que esta instrucción no aparecerá en otros circuitos, puedes configurarla así paraFalseobtener una pequeña mejora en la velocidad.
Devuelve
una referencia a los CircuitInstruction«s» que se añadieron realmente al circuito.
Tipo de retorno
Eleva
CircuitError – si la operación pasada no es una instancia de Instruction, o no puede convertirse en una llamando a to_instruction sobre ella.
append() realiza una comprobación de errores bastante importante para garantizar que no se rompa accidentalmente el modelo de datos de QuantumCircuit. Si estás generando programáticamente un circuito a partir de datos conocidos, puedes eludir gran parte de esta comprobación de errores utilizando el fast-path appender _append()pero a riesgo de que el que llama sea responsable de asegurarse de que está pasando sólo datos válidos.
_append
_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction
_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation
Añade una instrucción al final del circuito, modificando el circuito en su lugar.
Esta es una función interna de fast-path, y es responsabilidad de quien la llama asegurarse de que todos los argumentos son válidos; aquí no hay comprobación de errores. En concreto:
- todos los qubits y clbits deben existir ya en el circuito y no puede haber duplicados en la lista.
- cualquier instrucción de operaciones de flujo de control debe actuar sólo sobre variables presentes en el circuito.
- el circuito no debe estar dentro de un contexto constructor de flujo de control.
Esta función puede ser utilizada por otros usuarios que no sean QuantumCircuit cuando la persona que llama está segura de que ya se ha realizado toda la comprobación de errores, difusión y alcance, y la única referencia al circuito al que se están añadiendo las instrucciones se encuentra dentro de esa misma función. En particular, no es seguro llamar a QuantumCircuit._append() en un circuito que recibe un argumento de función. Esto se debe a que QuantumCircuit._append() no reconocerá las construcciones de ámbito de la interfaz del constructor de flujo de control.
Parámetros
-
instrucción -
Se debe añadir una descripción completa y bien estructurada
CircuitInstructionde la operación y su contexto.En el formulario de compatibilidad con versiones anteriores, puede tratarse de un
Operation, en cuyo casoqargsycargsdeben indicarse explícitamente. -
qargs – Argumento heredado para que los qubits se acoplen al «bare
Operation». Se ignora si el primer argumento está en forma preferencialCircuitInstruction. -
cargs : argumento heredado de clbits al que se adjunta el «bare
Operation». Se ignora si el primer argumento está en forma preferencialCircuitInstruction. -
_standard_gate (bool)
Devuelve
un manejador de la instrucción que se acaba de añadir.
Tipo de retorno
En otros casos, es posible que desee unir dos circuitos, aplicando las instrucciones de un circuito a qubits y clbits específicos de otro circuito. Esta operación de "inlining" se llama compose() en Qiskit. compose() es, en general, más potente que un to_instruction()-más-append() para unir dos circuitos, ya que también puede unir datos clásicos tipificados y permite unir operaciones de flujo de control de circuitos en otro circuito.
Las desventajas de compose() es que es una operación más compleja que puede implicar más reescritura del operando, y que necesariamente debe mover datos de un objeto del circuito a otro. Si estás construyendo un circuito para ti y el rendimiento bruto es un objetivo central, considera pasar tu circuito base y hacer que diferentes partes de tu algoritmo escriban directamente en el circuito base, en lugar de construir un circuito de capa temporal.
compose
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[True] = True, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → None
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[False] = False, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → QuantumCircuit
Aplicar las instrucciones de un circuito a los qubits y/o clbits especificados en otro.
Por defecto, esto crea un nuevo objeto circuito, dejando self intacto. Para la mayoría de los usos de esta función, es mucho más eficiente configurar inplace=True y modificar el circuito base in situ.
Cuando se trata de variables en tiempo real (expr.Var y expr.Stretch instancias), existen dos estrategias principales para utilizar compose():
- El circuito
otherse trata como totalmente aditivo, incluidas sus variables. Las variables deotherdeben ser totalmente distintas de las deself(utilicevar_remapcomo ayuda), y todas las variables deotherse declararán de nuevo en la salida con un ámbito de entrada/captura/local que coincida con el deother. Por lo general, esto es lo que quieres si vas a unir dos circuitos no relacionados. - El circuito
otherfue creado como una extensión exacta deselfpara ser inlineado sobre él, incluyendo la actuación sobre las variables existentes en sus estados al final deself. En este caso, se debe crearothercon todas estas variables a ser inlineadas declaradas como "captures", y luego se puede usarinline_captures=Trueen este método para enlazarlas. Por lo general, esto es lo que quieres si estás construyendo un circuito definiendo capas sobre la marcha, o reconstruyendo un circuito utilizando capas tomadas de sí mismo. Puede que el argumentovars_mode="captures"decopy_empty_like()para crear la base de cada capa, en este caso.
Parámetros
-
other (qiskit.circuit.Instruction orQuantumCircuit) – (sub)circuito o instrucción para componerse a sí mismo. Si no es un
QuantumCircuit, puede ser cualquier cosa queappendacepte. -
qubits (list[Qubit|int]) – qubits propios sobre los que componer.
-
clbits (list[Clbit|int]) – clbits de «self» sobre los que realizar la composición.
-
front (bool) – Si
True, se realizará la composición frontal. Esto no es posible dentro de los gestores de contexto del generador de flujo de control. -
inplace (bool) – Si es así
True, modifica el objeto. De lo contrario, devuelve el circuito compuesto. -
copy (bool) – Si (
Truevalor por defecto), la entrada se considera compartida y se copiarán todas las instrucciones que contenga, en caso de que sea necesario modificarlas en el futuro. Puedes configurar esta opción para indicar queFalsela entrada debe considerarse propiedad del circuito base, con el fin de evitar copias innecesarias; en este caso, no es válido utilizarotherposteriormente, y es posible que algunas instrucciones se hayan modificado in situ. -
var_remap (Mapping) –
para reescribir
expr.Varyexpr.Stretchenothera medida que se incorporan aself. Puede utilizarse para evitar conflictos de nombres.Tanto las claves como los valores pueden ser cadenas o identificadores directos. Si una clave es una cadena, coincide con cualquier
VaroStretchcon el mismo nombre. Si un valor es una cadena, cada vez que una nueva clave coincida con él, aparecerá un nuevo valorVaroStretchcon el tipo correcto. Si un valor es aVarsutypedebe coincidir exactamente con el de la variable a la que sustituye. -
inline_captures (bool) –
si
True, entonces todos los nodos identificadores "capturados" enotherQuantumCircuitse supone que se refieren a identificadores ya declarados enself(como cualquier tipo de entrada/captura/local), y los usos enotherse aplicarán a los identificadores existentes. Si quieres construir una capa para un circuito existente para usar concompose()puede que le resulte útil el argumentovars_mode="captures"decopy_empty_like()útil. Cualquier remapeo envars_remapocurre antes de evaluar esta variable inlining.Si es
False(el valor predeterminado), se exigirá que todos los identificadores deothersean distintos de los deself, y se harán nuevas declaraciones para ellos. -
wrap (bool) – Si es verdadero, envuelve el otro circuito en una puerta (o instrucción, dependiendo de si contiene únicamente instrucciones unitarias) antes de componerlo sobre sí mismo. En lugar de utilizar esta opción, casi siempre es mejor controlarlo manualmente tú mismo utilizando o
to_instruction()to_gate(), y después llamar aappend().
Devuelve
el circuito compuesto (devuelve None si inplace==True).
Tipo de retorno
Eleva
- CircuitError - si no se puede realizar una asignación correcta de cables entre los dos circuitos, como por ejemplo si
otheres más ancho queself. - CircuitError - si se intenta emitir un nuevo circuito mientras
selftiene activo un contexto de flujo de control parcialmente construido, como las formas de gestor de contexto deif_test(),for_loop()ywhile_loop(). - CircuitError - si se intenta componer al frente de un circuito cuando un bloque constructor de flujo de control está activo; no hay un significado claro para esta acción.
Ejemplos
>>> lhs.compose(rhs, qubits=[3, 2], inplace=True) ┌───┐ ┌─────┐ ┌───┐
lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├ lqr_1_0: ───┤ H ├───────────────
├───┤ ┌─┴─┐└─────┘ ├───┤
lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├─────── lqr_1_1: ───┤ X ├───────────────
┌──┴───┴──┐ └───┘ ┌──┴───┴──┐┌───┐
lqr_1_2: ┤ U1(0.1) ├ + = lqr_1_2: ┤ U1(0.1) ├┤ X ├───────
└─────────┘ └─────────┘└─┬─┘┌─────┐
lqr_2_0: ─────■───── lqr_2_0: ─────■───────■──┤ Tdg ├
┌─┴─┐ ┌─┴─┐ └─────┘
lqr_2_1: ───┤ X ├─── lqr_2_1: ───┤ X ├───────────────
└───┘ └───┘
lcr_0: 0 ═══════════ lcr_0: 0 ═══════════════════════
lcr_1: 0 ═══════════ lcr_1: 0 ═══════════════════════Si estás intentando unir dos circuitos que se aplicarán a qubits y clbits completamente disjuntos, tensor() es una forma cómoda de evitar tener que añadir manualmente objetos bit y llamar a compose().
tensor
tensor(other, inplace=False)
Tensor self con other.
Recuerde que en la convención little-endian la operación más a la izquierda estará en la parte inferior del circuito. Consulte también la documentación para obtener más información.
┌────────┐ ┌─────┐ ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├ = q_0: ─┤ top ├──
└────────┘ └─────┘ ┌┴─────┴─┐
q_1: ┤ bottom ├
└────────┘Parámetros
- other (QuantumCircuit) – El otro circuito con el que tensor este circuito.
- inplace (bool) – Si es así
True, modifica el objeto. De lo contrario, devuelve el circuito compuesto.
Tipo de retorno
QuantumCircuit | Ninguno
Ejemplos
from qiskit import QuantumCircuit
top = QuantumCircuit(1)
top.x(0);
bottom = QuantumCircuit(2)
bottom.cry(0.2, 0, 1);
tensored = bottom.tensor(top)
tensored.draw('mpl')
Devuelve
El circuito tensado (devuelve None si inplace=True).
Tipo de retorno
Parámetros
- other (QuantumCircuit)
- inplace (bool)
Como algunas reglas generales:
- Si tienes un solo
Operation,InstructionoGate, sin duda deberías usarappend()o_append(). - Si tiene un
QuantumCircuitque representa una única instrucción atómica para un circuito mayor que desea reutilizar, probablemente querrá llamar ato_instruction()oto_gate()y luego aplicar el resultado al circuito usandoappend(). - Si tiene un circuito
QuantumCircuitque representa una "capa" más grande de otro circuito, o contiene variables clásicas tipadas o flujo de control, debe utilizarcompose()para fusionarlo con otro circuito. tensor()se busca mucho menos queappend()ocompose(). Internamente, es sobre todo una envoltura alrededor deadd_bits()ycompose().
Algunos peligros potenciales con los que hay que tener cuidado:
- Aunque reutilices una función personalizada
Instructiondurante la construcción del circuito, el transpilador, por lo general, tendrá que «desenrollar» cada invocación de la misma hasta su descomposición interna antes de empezar a trabajar en ella.to_instruction()Esto no debería impedirte utilizar el patrón «-plus-»append(), ya que el transpilador irá mejorando en este aspecto con el tiempo. compose()producirá, por defecto, un nuevo circuito por compatibilidad con versiones anteriores. Esto es más caro, y no suele ser lo que quieres, por lo que deberías ponerinplace=True.- Tanto
append()comocompose()(pero no_append()) tienen uncopyargumento de palabra clave cuyo valor por defecto esTrue. En estos casos, las instancias entrantesOperationse copiarán si Qiskit detecta que los objetos son mutables (por ejemplo, al tomar los parámetros de las puertas). Si estás seguro de que no volverás a utilizar los objetos en otros lugares, deberías configurarcopy=Falsepara evitar esta copia, lo que puede suponer una mejora considerable de la velocidad en el caso de objetos de gran tamaño.
Métodos para añadir instrucciones estándar
La QuantumCircuit clase dispone de métodos auxiliares para añadir muchas de las instrucciones y puertas de la biblioteca estándar de Qiskit a un circuito. Esto equivale, en general, a crear manualmente una instancia del objeto qiskit.circuit.library correspondiente y, a continuación, pasarla a append() con los argumentos restantes colocados en los campos qargs cargs y según corresponda.
Los siguientes métodos aplican operaciones especiales no unitarias Instruction al circuito:
QuantumCircuit método | |
|---|---|
barrier() | Barrier |
delay() | Delay |
initialize() | Initialize |
measure() | Measure |
reset() | Reset |
store() | Store |
Estos métodos aplican instancias unitarias Gate no controladas al circuito:
Los siguientes métodos se aplican a Gate instancias que también son puertas controladas, por lo que son subclases directas de ControlledGate:
QuantumCircuit método | |
|---|---|
ccx() | CCXGate |
ccz() | CCZGate |
ch() | CHGate |
cp() | CPhaseGate |
crx() | CRXGate |
cry() | CRYGate |
crz() | CRZGate |
cs() | CSGate |
csdg() | CSdgGate |
cswap() | CSwapGate |
csx() | CSXGate |
cu() | CUGate |
cx() | CXGate |
cy() | CYGate |
cz() | CZGate |
Por último, estos métodos aplican al circuito determinadas puertas generalizadas de control múltiple, a menudo con síntesis ávidas. Se enumeran en función de la puerta base que controlan, ya que su salida exacta suele ser una versión sintetizada de una puerta.
El resto de esta sección es el listado API de todos los métodos individuales; las tablas anteriores son resúmenes cuyos enlaces le llevarán al lugar correcto.
barrier
barrier(*qargs, label=None)
Aplicar Barrier. Si qargs está vacío, se aplica a todos los qubits del circuito.
Parámetros
- qargs (QubitSpecifier) – Especificación para uno o más argumentos qubit.
- label (str) – La etiqueta de cadena de la barrera.
Devuelve
asa a las instrucciones añadidas.
Tipo de retorno
ccx
ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None, label=None)
Solicitar CCXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
ccz
ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)
Solicitar CCZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «10»). Por defecto, el control se realiza en el estado «11».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
ch
ch(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CHGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cp
cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CPhaseGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
crx
crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CRXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cry
cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CRYGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
crz
crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CRZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cs
cs(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CSGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
csdg
csdg(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CSdgGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cswap
cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)
Solicitar CSwapGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- target_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej.,
'1'). Por defecto, se controla en función del estado'1'.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
csx
csx(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CSXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cu
cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CUGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la puerta.
- phi (ParameterExpression |float) – El ángulo de rotación de la puerta.
- lam (ParameterExpression |float) – El ángulo de rotación de la puerta.
- gamma (ParameterExpression |float) – La fase global aplicada a la puerta U, en caso de que se aplique.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cx
cx(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cy
cy(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CYGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
cz
cz(control_qubit, target_qubit, label=None, ctrl_state=None)
Solicitar CZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
dcx
dcx(qubit1, qubit2, label=None)
Solicitar DCXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
delay
delay(duration, qarg=None, unit=None)
Solicitar Delay. Si qarg es None, se aplica a todos los qubits. Si se aplica a varios qubits, se crearán retardos con la misma duración.
Parámetros
- duration (Object) – duración del retraso. Si se trata de un
Exprdebe ser una expresión constante de tipoDuration. - qarg (Object) – qubit para aplicar este retardo.
- unit (str | None) – unidad de duración, a menos que
durationsea un, enExprcuyo caso no debe especificarse. Unidades compatibles:'s','ms','us','ns','ps', y'dt'. El valor por defecto es'dt', es decir, una unidad de tiempo entera que depende del backend de destino.
Devuelve
asa a las instrucciones añadidas.
Tipo de retorno
Eleva
CircuitError - si los argumentos tienen mal formato.
ecr
ecr(qubit1, qubit2, label=None)
Solicitar ECRGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El primer qubit al que se aplica la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El segundo qubit al que se va a aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
h
h(qubit, label=None)
Solicitar HGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
id
id(qubit, label=None)
Solicitar IGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
initialize
initialize(params, qubits=None, normalize=False)
Inicializar qubits en un estado específico.
La inicialización de los qubits se realiza restableciéndolos primero a un estado de « » y, a continuación, llamando StatePreparation a la clase para prepararlos en un estado específico. Ambos pasos figuran en las Initialize instrucciones.
Parámetros
-
params (Statevector | Sequence[complex] | str |int) –
El estado a inicializar puede ser cualquiera de los siguientes.
- Vector de estado o vector de amplitudes complejas para inicializar.
- Etiquetas de los estados base de los estados propios de Pauli Z, X e Y. Consulte
Statevector.from_label(). Fíjate en que el orden de las etiquetas es inverso al del índice del qubit al que se va a aplicar. La etiqueta'01'«Example» inicializa el qubit cero como y el qubit uno como . - Un entero que se utiliza como un mapa de bits que indica qué qubits inicializar a . Ejemplo: establecer params a 5 inicializaría el qubit 0 y el qubit 2 a y el qubit 1 a .
-
qubits (Sequence[QubitSpecifier] | None) – Qubits a inicializar. Si
Nonela inicialización se aplica a todos los qubits del circuito. -
normalize (bool) – Indica si se debe normalizar una matriz de entrada a un vector unitario.
Devuelve
Un handle a las instrucciones creadas.
Ejemplos
Prepara un qubit en el estado .
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.initialize([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()Salida:
┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
└──────────────────────────────┘Inicializa, a partir de una cadena de caracteres, dos qubits en el estado . El orden de las etiquetas se invierte con respecto al índice de los qubits. Encontrarás más información sobre las etiquetas de los estados básicos en Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()Salida:
┌──────────────────┐
q_0: ┤0 ├
│ Initialize(0,1) │
q_1: ┤1 ├
└──────────────────┘Inicializar dos qubits a partir de una matriz de amplitudes complejas.
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()Salida:
┌────────────────────────────────────┐
q_0: ┤0 ├
│ Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└────────────────────────────────────┘iswap
iswap(qubit1, qubit2, label=None)
Solicitar iSwapGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El primer qubit al que se aplica la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El segundo qubit al que se va a aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
mcp
mcp(lam, control_qubits, target_qubit, ctrl_state=None, label=None)
Solicitar MCPhaseGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- lam (ParameterExpression |float) – El ángulo de rotación.
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
mcrx
mcrx(theta, q_controls, q_target, use_basis_gates=False)
Aplicar puerta de rotación X de control múltiple
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit al que se dirige la puerta.
- use_basis_gates (bool) – : utiliza puertas básicas p, u y cx.
mcry
mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)
Aplicar puerta de rotación Y de control múltiple
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit al que se dirige la puerta.
- q_ancillae (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – La lista de qubits auxiliares.
- mode (str | None) – El modo de implementación que se va a utilizar.
- use_basis_gates (bool) – : utiliza puertas básicas p, u y cx
mcrz
mcrz(lam, q_controls, q_target, use_basis_gates=False)
Aplicar puerta de rotación Z de control múltiple
Parámetros
- lam (ParameterExpression |float) – El ángulo de rotación.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit al que se dirige la puerta.
- use_basis_gates (bool) – : utiliza puertas básicas p, u y cx.
mcx
mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None, label=None)
Solicitar MCXGate.
La puerta multi-cX puede implementarse utilizando diferentes técnicas, que utilizan diferentes números de qubits ancilla y tienen diferente profundidad de circuito. Estos modos son:
'noancilla': Requiere 0 qubits ancilla.'recursion': Requiere 1 qubit ancilla si se utilizan más de 4 controles, en caso contrario 0.'v-chain': Requiere 2 ancillas menos que el número de qubits de control.'v-chain-dirty': Igual que para las ancillas limpias (pero el circuito será más largo).
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
qiskit.circuit.quantumcircuit.QuantumCircuit.mcx() mode es obsoleto a partir de Qiskit. 2.1 Se retirará como muy pronto 3 meses después de la fecha de publicación. En su lugar, añada un MCXGate genérico al circuito y especifique el método de síntesis a través de hls_config en la transpilación. Alternativamente, las descomposiciones específicas están disponibles en https://qisk.it/mcx.
Parámetros
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- ancilla_qubits (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – Los qubits utilizados como ancillas, si el modo así lo requiere.
- mode (str | None) – La elección del modo, tal y como se ha explicado anteriormente.
- ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Eleva
- ValueError : si se desconoce el modo indicado o si se han pasado muy pocos qubits auxiliares.
- AttributeError : si no se pasan qubits auxiliares, pero se necesitan algunos.
Tipo de retorno
measure
measure(qubit, cbit)
Medir un bit cuántico (qubit) en la base Z en un bit clásico (cbit).
Cuando se mide un estado cuántico, un qubit se proyecta en la base computacional (Pauli Z) a o . El bit clásico cbit indica el resultado de esa proyección como 0 o 1 respectivamente. Esta operación no es reversible.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit(s) que se van a medir.
- cbit (Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]) – bit(s) clásico(s) en el que(s) colocar el(los) resultado(s) de la medición, o un de
expr.Vartipotypes.Uintque indexe el clbit de destino.
Devuelve
asa a las instrucciones añadidas.
Tipo de retorno
Eleva
CircuitError - si los argumentos tienen mal formato.
Ejemplos
En este ejemplo, se mide un qubit y el resultado de esa medición se almacena en el bit clásico (normalmente expresado en diagramas como una línea doble):
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw() ┌───┐┌─┐
q: ┤ H ├┤M├
└───┘└╥┘
c: 1/══════╩═
0Es posible llamar a measure con listas de qubits y cbits como un atajo para la medición uno a uno. Estas dos formas producen resultados idénticos:
circuit = QuantumCircuit(2, 2)
circuit.measure([0,1], [0,1])circuit = QuantumCircuit(2, 2)
circuit.measure(0, 0)
circuit.measure(1, 1)En lugar de listas, puede utilizar QuantumRegister y ClassicalRegister con la misma lógica.
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)Esto es equivalente a:
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])ms
ms(theta, qubits, label=None)
Solicitar MSGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits a los que se va a aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
p
p(theta, qubit, label=None)
Solicitar PhaseGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
pauli
pauli(pauli_string, qubits, label=None)
Solicitar PauliGate.
Parámetros
- pauli_string (str) – Una cadena que representa el operador de Pauli que se va a aplicar, p. ej., «XX».
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits a los que se aplicará esta puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
prepare_state
prepare_state(state, qubits=None, label=None, normalize=False)
Preparar qubits en un estado específico.
Esta clase implementa una unidad de preparación del estado. A diferencia de initialize() no reinicia primero los qubits.
Parámetros
-
state (Statevector | Sequence[complex] | str |int) –
El estado a inicializar puede ser cualquiera de los siguientes.
- Vector de estado o vector de amplitudes complejas para inicializar.
- Etiquetas de los estados base de los estados propios de Pauli Z, X e Y. Consulte
Statevector.from_label(). Fíjate en que el orden de las etiquetas es inverso al del índice del qubit al que se va a aplicar. La etiqueta de ejemplo «01» inicializa el qubit cero como y el qubit uno como . - Un entero que se utiliza como un mapa de bits que indica qué qubits inicializar a . Ejemplo: establecer params a 5 inicializaría el qubit 0 y el qubit 2 a y el qubit 1 a .
-
qubits (Sequence[QubitSpecifier] | None) – Qubits a inicializar. Si
Nonela inicialización se aplica a todos los qubits del circuito. -
label (str | None) – Una etiqueta opcional para la compuerta
-
normalize (bool) – Indica si se debe normalizar una matriz de entrada a un vector unitario.
Devuelve
Un "handle" de la instrucción que se acaba de inicializar
Tipo de retorno
Ejemplos
Prepara un qubit en el estado .
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()Salida:
┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
└─────────────────────────────────────┘Prepara, a partir de una cadena, dos qubits en el estado . El orden de las etiquetas es inverso al del índice de los qubits. Encontrarás más información sobre las etiquetas de los estados básicos en Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()Salida:
┌─────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,1) │
q_1: ┤1 ├
└─────────────────────────┘Inicializar dos qubits a partir de una matriz de amplitudes complejas
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()Salida:
┌───────────────────────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└───────────────────────────────────────────┘r
r(theta, phi, qubit, label=None)
Solicitar RGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- phi (ParameterExpression |float) – El ángulo del eje de rotación en el plano x-y.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rcccx
rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit, label=None)
Solicitar RC3XGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como segundo control.
- control_qubit3 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como tercer control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rccx
rccx(control_qubit1, control_qubit2, target_qubit, label=None)
Solicitar RCCXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
reset
reset(qubit)
Restablece los bits cuánticos a su estado por defecto.
Parámetros
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit(s) que se deben restablecer.
Devuelve
a la instrucción añadida.
Tipo de retorno
rv
rv(vx, vy, vz, qubit, label=None)
Solicitar RVGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Rotación alrededor de un eje de rotación arbitrario , donde es el ángulo de rotación en radianes.
Parámetros
- vx (ParameterExpression |float) –, componente x del eje de rotación.
- vy (ParameterExpression |float) –, componente y del eje de rotación.
- vz (ParameterExpression |float) –, componente z del eje de rotación.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rx
rx(theta, qubit, label=None)
Solicitar RXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rxx
rxx(theta, qubit1, qubit2, label=None)
Solicitar RXXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
ry
ry(theta, qubit, label=None)
Solicitar RYGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
ryy
ryy(theta, qubit1, qubit2, label=None)
Solicitar RYYGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rz
rz(phi, qubit, label=None)
Solicitar RZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- phi (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rzx
rzx(theta, qubit1, qubit2, label=None)
Solicitar RZXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rzz
rzz(theta, qubit1, qubit2, label=None)
Solicitar RZZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la compuerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
s
s(qubit, label=None)
Solicitar SGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sdg
sdg(qubit, label=None)
Solicitar SdgGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
store
store(lvalue, rvalue, /)
Almacena el resultado de la expresión clásica en tiempo real dada rvalue en la posición de memoria definida por lvalue.
Normalmente lvalue será un Var y rvalue será un nodo Expr para escribir en él, pero cualquier cosa que expr.lift() pueda elevar a un Expr es permisible en ambos sitios, y será llamado en ellos.
Parámetros
- lvalue (Any) – un especificador válido para una posición de memoria en el circuito. Normalmente será un nodo
Varpero también se puede escribir enClbitoClassicalRegisterubicaciones de memoria si su hardware lo soporta. La posición de memoria debe estar ya presente en el circuito. - rvalue (Any) – una expresión clásica en tiempo real cuyo resultado debe escribirse en la posición de memoria dada.
Tipo de retorno
La clase de soporte Instruction que representa esta operación.
Crea una nueva variable en el circuito en la que se pueda escribir con este método.
swap
swap(qubit1, qubit2, label=None)
Solicitar SwapGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El primer qubit al que se aplica la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El segundo qubit al que se va a aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sx
sx(qubit, label=None)
Solicitar SXGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sxdg
sxdg(qubit, label=None)
Solicitar SXdgGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
t
t(qubit, label=None)
Solicitar TGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
tdg
tdg(qubit, label=None)
Solicitar TdgGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
u
u(theta, phi, lam, qubit, label=None)
Solicitar UGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- theta (ParameterExpression |float) – El ángulo de rotación de la puerta.
- phi (ParameterExpression |float) – El ángulo de rotación de la puerta.
- lam (ParameterExpression |float) – El ángulo de rotación de la puerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
unitary
unitary(obj, qubits, label=None)
Aplique la puerta unitaria especificada por obj a qubits.
Parámetros
- obj (np.ndarray | Gate | BaseOperator) – Operador unitario.
- qubits (Sequence[QubitSpecifier]) – Los qubits del circuito a los que aplicar la transformación.
- label (str | None) – Nombre unitario para el backend [Default: None].
Devuelve
El circuito cuántico.
Tipo de retorno
Ejemplo
Aplicar una puerta especificada por una matriz unitaria a un circuito cuántico
from qiskit import QuantumCircuit
matrix = [[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0]]
circuit = QuantumCircuit(2)
circuit.unitary(matrix, [0, 1])x
x(qubit, label=None)
Solicitar XGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
y
y(qubit, label=None)
Solicitar YGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
z
z(qubit, label=None)
Solicitar ZGate.
Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.
Parámetros
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se aplicará la puerta.
- label (str | None) – La etiqueta de cadena de la puerta del circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
Añadir flujo de control a los circuitos
Debate sobre cómo se representan las operaciones de flujo de control en todo el qiskit.circuit contexto.
QuantumCircuit método | Instrucción de flujo de control |
|---|---|
if_test() | IfElseOp solo con un True cuerpo |
if_else() | IfElseOp con los True cuerpos y False |
while_loop() | WhileLoopOp |
switch() | SwitchCaseOp |
for_loop() | ForLoopOp |
box() | BoxOp |
break_loop() | BreakLoopOp |
continue_loop() | ContinueLoopOp |
QuantumCircuit cuenta con los métodos correspondientes para todas las operaciones de flujo de control que admite Qiskit. Hay dos formas de llamarlas. ControlFlowOpLa primera es una envoltura de conveniencia muy sencilla que toma como QuantumCircuit argumentos los cuerpos de los bloques de las instrucciones y, simplemente, construye y añade el correspondiente.
La segunda forma, que te recomendamos encarecidamente que utilices para construir el flujo de control, se denomina «interfaz de constructor ». En este caso, los métodos solo toman el discriminante en tiempo real de la operación y devuelven gestores de contexto que se introducen mediante with. A continuación, puedes utilizar métodos normales QuantumCircuit dentro de esos bloques para construir los cuerpos del flujo de control, y Qiskit hará un seguimiento automático de cuáles son los recursos de datos necesarios para los bloques internos, construyendo el conjunto completo ControlFlowOp a medida que sales de la with instrucción. Es mucho más sencillo y menos propenso a errores crear el flujo de control mediante programación de esta manera.
Al utilizar la interfaz del constructor de flujo de control, puede que a veces quieras que un qubit se incluya en un bloque, aunque no tenga operaciones definidas. En este caso, puede utilizar el método noop() método.
QuantumCircuit.has_control_flow_op()Para comprobar si un circuito contiene un ControlFlowOp , puedes utilizar el método auxiliar.
box
box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)
Crear un box de operaciones en este circuito que se tratan atómicamente en el contexto mayor.
Una "caja" es una construcción de flujo de control que se introduce incondicionalmente. El contenido de la caja se comporta como si el inicio y el final de la caja fueran barreras (véase barrier()), con la salvedad de que se permite conmutar operaciones "hasta el final" de la caja. La caja también es un ámbito explícito a efectos de variables, tramos y pases del compilador.
Existen dos formas de llamar a esta función:
- Pasa un
QuantumCircuitpor referencia, así como elqubitsyclbitsel sobre los que actúa. En este formulario, se crea inmediatamente unBoxOpy se añade utilizando el circuito como contenido. - Utilícelo en una sentencia
withsinbody,qubitsoclbits. Este es el "formulario de interfaz del constructor", en el que luego se utilizan otrosQuantumCircuitmétodos dentro del ámbito Pythonwithpara añadir instrucciones albox. Esta es la forma preferida, y mucho menos propensa a errores.
Ejemplos
Utilizando la interfaz del constructor para añadir dos cajas en secuencia. Las dos cajas de este circuito pueden ejecutarse simultáneamente, y la segunda inserta explícitamente una dependencia de flujo de datos en el qubit 8 durante la duración de la caja, aunque el qubit esté inactivo.
from qiskit.circuit import QuantumCircuit, Annotation
class MyAnnotation(Annotation):
namespace = "my.namespace"
qc = QuantumCircuit(9)
with qc.box():
qc.cz(0, 1)
qc.cz(2, 3)
with qc.box([MyAnnotation()]):
qc.cz(4, 5)
qc.cz(6, 7)
qc.noop(8)Utilizando la construcción explícita de la caja. Esto crea el mismo circuito que antes, y debería dar una indicación de por qué se prefiere la forma anterior para el uso interactivo.
from qiskit.circuit import QuantumCircuit, BoxOp
body_0 = QuantumCircuit(4)
body_0.cz(0, 1)
body_0.cz(2, 3)
# Note that the qubit indices inside a body related only to the body. The
# association with qubits in the containing circuit is made by the ``qubits``
# argument to `QuantumCircuit.box`.
body_1 = QuantumCircuit(5)
body_1.cz(0, 1)
body_1.cz(2, 3)
qc = QuantumCircuit(9)
qc.box(body_0, [0, 1, 2, 3], [])
qc.box(body_1, [4, 5, 6, 7, 8], [])Parámetros
- body_or_annotations (QuantumCircuit |Iterable[Annotation]) – El primer argumento posicional no tiene nombre. Si se pasa un
QuantumCircuitcomo parámetro posicional, se utiliza inmediatamente como cuerpo del recuadro, yqubitstambién deben especificarse yclbits. Si no se especifica, o si se especifica un iterable deAnnotationobjetos, se activa la versión de este método correspondiente al gestor de contexto. - qubits (Sequence[QubitSpecifier] | None) – los qubits a los que se aplica la
BoxOpoperación, en su forma explícita. - clbits (Sequence[ClbitSpecifier] | None) – los clbits a los
BoxOpque se debe aplicar el, en forma explícita. - label (str | None) – : una etiqueta de cadena opcional para la instrucción.
- duration (None) – una duración explícita opcional para el
BoxOp. Los pases de programación tienen la restricción de programar el ámbito que contienen para que se ajuste a una duración determinada, incluyendo la inserción de retrasos si es necesario. - unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – la unidad de la
duration. - annotations (Iterable[Annotation]) – cualquier
Annotationobjeto que deba contener la caja. Cuando este método se utiliza en forma de gestor de contexto, este argumento puede pasarse, en su lugar, como único argumento posicional.
break_loop
break_loop()
Solicitar BreakLoopOp.
Si utilizas las formas «builder» del gestor de contexto de if_test(), for_loop() o while_loop(), solo podrás llamar a este método si te encuentras dentro de un contexto de bucle, ya que, de lo contrario, no se puede determinar el «ancho del recurso» de la operación. Esto provocaría rápidamente circuitos inválidos, por lo que, si intentas crear un cuerpo de bucle reutilizable (sin los gestores de contexto), también debes utilizar la forma sin gestor de contexto de if_test() y if_else(). Ten en cuenta que la BreakLoopOp instrucción debe abarcar todos los recursos del bucle que la contiene, no solo el ámbito inmediato.
Devuelve
Un handle de la instrucción creada.
Eleva
CircuitError - si este método fue llamado dentro de un contexto constructor, pero no contenido dentro de un bucle.
Tipo de retorno
continue_loop
continue_loop()
Solicitar ContinueLoopOp.
Si utilizas las formas «builder» del gestor de contexto de if_test(), for_loop() o while_loop(), solo podrás llamar a este método si te encuentras dentro de un contexto de bucle, ya que, de lo contrario, no se puede determinar el «ancho del recurso» de la operación. Esto provocaría rápidamente circuitos inválidos, por lo que, si intentas crear un cuerpo de bucle reutilizable (sin los gestores de contexto), también debes utilizar la forma sin gestor de contexto de if_test() y if_else(). Ten en cuenta que la ContinueLoopOp instrucción debe abarcar todos los recursos del bucle que la contiene, no solo el ámbito inmediato.
Devuelve
Un handle de la instrucción creada.
Eleva
CircuitError - si este método fue llamado dentro de un contexto constructor, pero no contenido dentro de un bucle.
Tipo de retorno
for_loop
for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None = None, body: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → ForLoopContext
for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
Crea un bucle for en este circuito.
Hay dos formas de llamar a esta función. bodySi se invoca con todos sus argumentos (con la posible excepción de label), creará un ForLoopOp con el dado. Si body no se pasan (ni qubits ni clbits), entonces esto actúa como un gestor de contexto que, al iniciarse, proporciona una variable de bucle (a menos que se especifique una, en cuyo caso se reutilizará) y creará automáticamente un ForLoopOp al finalizar el ámbito. En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.
Por ejemplo:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 1)
with qc.for_loop(range(5)) as i:
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((0, True)):
qc.break_loop()Parámetros
-
indexset (Iterable[int]) – Una colección de números enteros sobre la que se va a recorrer. Siempre es necesario.
-
loop_parameter (Optional[Parameter|expr.Var]) –
El parámetro utilizado en
bodyal que se asignarán los valores deindexset. En la forma de gestor de contexto, si no se proporciona este argumento, se le asignará un parámetro de bucle y se devolverá como valor de la sentenciawith. Sólo se incorporará al circuito si se utiliza dentro del cuerpo.Si este argumento es
Noneen la forma manual de este método,bodyse repetirá una vez para cada uno de los elementos deindexsetpero se ignorarán sus valores. -
body (Optional[QuantumCircuit]) – El cuerpo del bucle que se ejecutará repetidamente. Omítalo para utilizar el modo de gestor de contexto.
-
qubits (Optional[Sequence[QubitSpecifier]]) – Los qubits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
-
clbits (Optional[Sequence[ClbitSpecifier]]) – Los clbits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
-
label (Optional[str]) – La etiqueta de cadena de la instrucción en el circuito.
Devuelve
dependiendo de la firma de la llamada, bien un gestor de contexto para crear el bucle «for» (que se añadirá automáticamente al circuito al final del bloque), bien un InstructionSet identificador de la operación de bucle añadida.
Tipo de retorno
InstructionSet o ForLoopContext
Eleva
CircuitError - si se utiliza una convención de llamada incorrecta.
if_else
if_else(condition, true_body, false_body, qubits, clbits, label=None)
Solicitar IfElseOp.
Este método no tiene un formulario de gestor de contexto asociado, porque ya está gestionado por el método if_test() método Puedes utilizar la parte else con algo como:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((bits[2], 0)) as else_:
qc.h(0)
with else_:
qc.x(0)Parámetros
- condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool] | Expr) – Una condición que se evalúa en tiempo real durante la ejecución del circuito y que, si es verdadera, activará la evaluación de
true_body. O bien unExprde tipoBool(), o bien la forma tradicional de igualdad de dos tuplas(register_or_bit, value). - true_body (QuantumCircuit) – El cuerpo del circuito que se ejecutará si
conditiones verdadero. - false_body (QuantumCircuit) – El circuito que se ejecutará si
conditiones falso. - qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits del circuito sobre los que debe ejecutarse la instrucción «if/else».
- clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – Los clbits del circuito sobre los que debe ejecutarse la instrucción «if/else».
- label (str | None) – La etiqueta de cadena de la instrucción en el circuito.
Eleva
CircuitError - Si la condición proporcionada hace referencia a Clbits fuera del circuito envolvente.
Devuelve
Un handle de la instrucción creada.
Tipo de retorno
if_test
if_test(condition: tuple[ClassicalRegister | Clbit, int] | Expr) → IfContext
if_test(condition: tuple[ClassicalRegister | Clbit, int] | Expr, true_body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
Cree una declaración if en este circuito.
Hay dos formas de llamar a esta función. true_bodySi se invoca con todos sus argumentos (con la posible excepción de label), creará un IfElseOp con el dado, y no habrá ninguna ramificación para la false condición (véase también el if_else() método ). Sin embargo, si true_body no se pasan (y qubits y clbits), entonces actúa como un gestor de contexto, que puede utilizarse para construir if sentencias. El valor de retorno de la with instrucción es un gestor de contexto encadenable, que puede utilizarse para crear bloques posteriores else . En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.
Por ejemplo:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Qubit(), Clbit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 1)
with qc.if_test((bits[3], 0)) as else_:
qc.x(2)
with else_:
qc.h(2)
qc.z(2)Parámetros
- condition (expr.Expr | Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición que se evalúa en tiempo real durante la ejecución del circuito y que, si es verdadera, activará la evaluación de
true_body. O bien unExprde tipoBool(), o bien la forma tradicional de igualdad de dos tuplas(register_or_bit, value). - true_body (Optional[QuantumCircuit]) – El cuerpo del circuito que se ejecutará si
conditiones verdadero. - qubits (Optional[Sequence[QubitSpecifier]]) – Los qubits del circuito sobre los que debe ejecutarse el if/else.
- clbits (Optional[Sequence[ClbitSpecifier]]) – Los clbits del circuito sobre los que debe ejecutarse el if/else.
- label (Optional[str]) – La etiqueta de cadena de la instrucción en el circuito.
Devuelve
dependiendo de la sintaxis de la llamada, bien un gestor de contexto para crear el if bloque (que se añadirá automáticamente al circuito al final del bloque), bien un InstructionSet identificador de la operación condicional añadida.
Tipo de retorno
InstructionSet o IfContext
Eleva
- CircuitError - Si la condición proporcionada hace referencia a Clbits fuera del circuito envolvente.
- CircuitError - si se utiliza una convención de llamada incorrecta.
Devuelve
Un handle de la instrucción creada.
switch
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Expr, cases: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → SwitchContext
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Expr, cases: Iterable[tuple[Any, QuantumCircuit]], qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
Cree una estructura switch/case en este circuito.
Hay dos formas de llamar a esta función. Si se invoca con todos sus argumentos (con la posible excepción de label), creará un SwitchCaseOp con la estructura de caso indicada. Si cases no se pasan (ni qubits ni clbits), entonces esto actúa como un gestor de contexto, que creará automáticamente un SwitchCaseOp cuando finalice el ámbito. En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.
Ejemplo de uso:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
qc.h([0, 1, 2])
qc.measure([0, 1, 2], [0, 1, 2])
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.z(1)
with case(case.DEFAULT):
qc.cx(0, 1)Parámetros
- target (expr.Expr | Union[ClassicalRegister, Clbit]) – El valor clásico para encenderlo. O bien un
Exprde tipoBool()oUint(n), o bien un oClassicalRegisterClbit. - cases (Iterable[Tuple[Any, QuantumCircuit]]) – Una secuencia de especificadores de caso. Cada tupla define un cuerpo de caso (el segundo elemento). El primer elemento de la tupla puede ser un único valor entero, el valor especial
CASE_DEFAULTo una tupla de varios valores enteros. Cada uno de los valores enteros se probará sucesivamente; el control pasará entonces al cuerpo correspondiente a la primera coincidencia.CASE_DEFAULTcoincide con todos los valores posibles. Omitir en forma de gestor de contexto. - qubits (Sequence[Qubit]) – Los qubits del circuito sobre los que se ejecutan todos los cuerpos del caso. Omitir en forma de gestor de contexto.
- clbits (Sequence[Clbit]) – Los clbits del circuito sobre los que se ejecutan todos los cuerpos del caso. Omitir en forma de gestor de contexto.
- label (Optional[str]) – La etiqueta de cadena de la instrucción en el circuito.
Devuelve
Si se utiliza en modo de gestor de contexto, debe utilizarse como recurso with , que devolverá un objeto que puede introducirse repetidamente para producir casos para la sentencia switch. Si se utiliza la forma completa, devuelve un manejador a las instrucciones creadas.
Tipo de retorno
InstructionSet o SwitchCaseContext
Eleva
CircuitError - si se utiliza una convención de llamada incorrecta.
while_loop
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → WhileLoopContext
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
Crea un bucle while en este circuito.
Existen dos formas de llamar a esta función. Si se llama con todos sus argumentos (con la posible excepción de label), creará un WhileLoopOp con el body dado. Si body (y qubits y clbits) no se pasan, entonces esto actúa como un gestor de contexto, que construirá automáticamente un WhileLoopOp cuando el ámbito termine. De esta forma, no necesitas llevar la cuenta de los qubits o clbits que estás utilizando, porque el scope lo hará por ti.
Ejemplo de uso:
from qiskit.circuit import QuantumCircuit, Clbit, Qubit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
with qc.while_loop((bits[2], 0)):
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)Parámetros
- condition (expr.Expr | Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición que hay que comprobar antes de ejecutar
body. O bien unExprde tipoBool(), o bien la forma tradicional de igualdad de dos tuplas(register_or_bit, value). - body (Optional[QuantumCircuit]) – El cuerpo del bucle que se ejecutará repetidamente. Omítalo para utilizar el modo de gestor de contexto.
- qubits (Optional[Sequence[Qubit]]) – Los qubits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
- clbits (Optional[Sequence[Clbit]]) – Los clbits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
- label (Optional[str]) – La etiqueta de cadena de la instrucción en el circuito.
Devuelve
Si se utiliza en modo gestor de contexto, debe utilizarse como recurso with , que inferirá el contenido del bloque y los operandos al salir. Si se utiliza la forma completa, devuelve un manejador a las instrucciones creadas.
Tipo de retorno
InstructionSet o WhileLoopContext
Eleva
CircuitError - si se utiliza una convención de llamada incorrecta.
noop
noop(*qargs)
Marca el qubit o qubits dados como utilizados dentro del ámbito actual, sin añadir una operación.
Esto no tiene ningún efecto (aparte de lanzar una excepción si la entrada no es válida) cuando se llama en el ámbito superior de un archivo QuantumCircuit. Dentro de un constructor de flujo de control, esto hace que el qubit sea "utilizado" por el bloque de flujo de control, si no lo estuviera ya, sin añadir ninguna operación adicional sobre él.
Por ejemplo:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(3)
with qc.box():
# This control-flow block will only use qubits 0 and 1.
qc.cx(0, 1)
with qc.box():
# This control-flow block will contain only the same operation as the previous
# block, but it will also mark qubit 2 as "used" by the box.
qc.cx(0, 1)
qc.noop(2)Parámetros
*qargs ( Qubit | QuantumRegister | int | slice | Sequence [ Qubit | int ] ) – lista variádica de especificadores de qubit válidos. Cualquier cosa que pueda pasarse como un qubit o un conjunto de qubits es válida para cada argumento de esta función.
Eleva
CircuitError - si algún qubit solicitado no es válido para el circuito.
has_control_flow_op
has_control_flow_op()
Comprueba si el circuito contiene una instancia de ControlFlowOp entre sus operaciones.
Tipo de retorno
Conversión de circuitos a otros objetos
Tal y como se explica en «Métodos para añadir operaciones generales », puedes convertir un circuito en un Instruction o en un Gate utilizando dos métodos auxiliares.
to_instruction
to_instruction(parameter_map=None, label=None)
Crea un Instruction a partir de este circuito.
circuit_to_instruction()
El motor subyacente de este método.
Parámetros
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – En el caso de los circuitos parametrizados, una correspondencia entre los parámetros del circuito y los parámetros que se utilizarán en la instrucción. Si el valor es «None», los parámetros del circuito existentes también se aplicarán a la instrucción.
- label (str | None) – Etiqueta opcional de la puerta.
Devuelve
una instrucción compuesta que encapsula este circuito (puede ser
espalda descompuesta).
Tipo de retorno
to_gate
to_gate(parameter_map=None, label=None)
Crea un Gate a partir de este circuito. El circuito debe actuar únicamente sobre qubits y contener únicamente operaciones unitarias.
circuit_to_gate()
El motor subyacente de este método.
Parámetros
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – En el caso de los circuitos parametrizados, una correspondencia entre los parámetros del circuito y los parámetros que se utilizarán en la puerta lógica. En ese caso
None, los parámetros del circuito existente también determinarán los parámetros de la puerta. - label (str | None) – Etiqueta opcional de la puerta.
Devuelve
una puerta compuesta que encapsula este circuito (puede descomponerse de nuevo).
Tipo de retorno
Además, puedes convertir todo el circuito a la DAGCircuit representación:
to_dag
to_dag(*, copy_operations=True)
Convierte este circuito en un DAGCircuit.
Se trata de un sencillo envoltorio alrededor de circuit_to_dag().
Parámetros
copy_operations (bool) – si se debe realizar una copia profunda de las instrucciones individuales. Si se configura en False, la operación es más económica, pero las modificaciones en las instrucciones del DAG afectarán al circuito original.
Devuelve
un DAG que representa este mismo circuito.
Tipo de retorno
Métodos de mutación auxiliar
Existen dos métodos superiores en QuantumCircuit para añadir medidas al final de un circuito. Tenga en cuenta que, por defecto, también añaden un registro adicional.
measure_active
measure_active(inplace=True)
Añade medidas a todos los qubits no inactivos. Crea un nuevo ClassicalRegister con un tamaño igual al número de qubits no ociosos que se están midiendo.
Devuelve un nuevo circuito con medidas si inplace=False.
Parámetros
inplace (bool) – Todas las mediciones se realizan in situ o se devuelve un nuevo circuito.
Devuelve
Devuelve el circuito con las medidas cuando inplace = False.
Tipo de retorno
measure_all
measure_all(inplace=True, add_bits=True)
Añade medida a todos los qubits.
Por defecto, añade nuevos bits clásicos en un ClassicalRegister para almacenar estas mediciones. Si add_bits=False, los resultados de las mediciones se almacenarán en cambio en los bits clásicos ya existentes, midiéndose el qubit n en el bit clásico n.
Devuelve un nuevo circuito con medidas si inplace=False.
Parámetros
- inplace (bool) – Todas las mediciones se realizan in situ o se devuelve un nuevo circuito.
- add_bits (bool) – Si se deben añadir nuevos bits para almacenar los resultados.
Devuelve
Devuelve el circuito con las medidas cuando inplace=False.
Tipo de retorno
Eleva
CircuitError - si add_bits=False pero no hay suficientes bits clásicos.
También hay dos métodos «sustractivos» en QuantumCircuit . RemoveFinalMeasurementsEste no es un caso de uso para el que QuantumCircuit esté diseñado; normalmente, lo mejor es utilizar copy_empty_like() en lugar de clear(), y ejecutar remove_final_measurements() como su forma de paso del transpilador.
clear
clear()
Borrar todas las instrucciones en uno mismo.
Al borrar los circuitos se conservarán los metadatos.
Un método para producir un nuevo circuito sin instrucciones y con el mismo rastreo de datos tipificados cuánticos y clásicos, pero sin mutar el circuito original.
Tipo de retorno
Ninguna
remove_final_measurements
remove_final_measurements(inplace=True)
Elimina las mediciones finales y las barreras en todos los qubits si están presentes. Elimina los registros clásicos que se utilizaron para almacenar los valores de estas mediciones que se vuelven inactivas como resultado de esta operación, y elimina los bits clásicos a los que sólo hacen referencia los registros eliminados, o a los que no se hace referencia en absoluto pero que se han vuelto inactivos como resultado de esta operación.
Las mediciones y barreras se consideran definitivas si no van seguidas de ninguna otra operación (aparte de otras mediciones o barreras)
Este método tiene un comportamiento bastante complejo, en particular en torno a la eliminación de los nuevos bits y registros clásicos inactivos. Es mucho más eficaz evitar añadir datos clásicos innecesarios en primer lugar, que intentar eliminarlos después.
Un pase de transpilador que elimina las medidas finales y las barreras. Esto no elimina los datos clásicos. Si este es tu objetivo, puedes llamarlo con:
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import RemoveFinalMeasurements
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.barrier()
qc.measure([0, 1], [0, 1])
pass_ = RemoveFinalMeasurements()
just_bell = pass_(qc)Parámetros
inplace (bool) – Todas las medidas se eliminan in situ o se devuelve un nuevo circuito.
Devuelve
Devuelve el circuito resultante si inplace=False, si no Ninguno.
Tipo de retorno
Propiedades del circuito
Métricas de circuitos simples
Al construir circuitos cuánticos, hay varias propiedades que ayudan a cuantificar el "tamaño" de los circuitos y su capacidad para ejecutarse en un dispositivo cuántico ruidoso. Algunos de ellos, como el número de qubits, son fáciles de entender, mientras que otros, como la profundidad y el número de componentes del tensor, requieren algo más de explicación. Aquí explicaremos todas estas propiedades y, como preparación para comprender cómo cambian los circuitos cuando se ejecutan en dispositivos reales, destacaremos las condiciones en las que cambian.
Considera el siguiente circuito:
from qiskit import QuantumCircuit
qc = QuantumCircuit(12)
for idx in range(5):
qc.h(idx)
qc.cx(idx, idx+5)
qc.cx(1, 7)
qc.x(8)
qc.cx(1, 9)
qc.x(7)
qc.cx(1, 11)
qc.swap(6, 11)
qc.swap(6, 9)
qc.swap(6, 10)
qc.x(6)
qc.draw('mpl')
A partir del gráfico, es fácil ver que este circuito tiene 12 qubits y una colección de puertas Hadamard, CNOT, X y SWAP. Pero, ¿cómo cuantificarlo programáticamente? Como podemos hacer puertas de un solo qubit en todos los qubits simultáneamente, el número de qubits en este circuito es igual al width() del circuito:
assert qc.width() == 12También podemos obtener directamente el número de qubits utilizando num_qubits:
assert qc.num_qubits == 12Para un circuito cuántico compuesto sólo de qubits, la anchura del circuito es igual al número de qubits. Esta es la definición utilizada en la computación cuántica. Sin embargo, para circuitos más complicados con registros clásicos y puertas controladas clásicamente, esta equivalencia se rompe. Por ello, a partir de ahora no nos referiremos al número de qubits de un circuito cuántico como la anchura.
También es sencillo obtener el número y tipo de puertas de un circuito utilizando count_ops():
qc.count_ops()OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])También podemos obtener sólo el recuento bruto de operaciones calculando los circuitos size():
assert qc.size() == 19count_ops
count_ops()
Cuenta cada tipo de operación en el circuito.
Devuelve
Un desglose del número de operaciones de cada tipo, ordenadas por importe.
Tipo de retorno
OrderedDict [ str, int ]
depth
depth(filter_function=<function QuantumCircuit.<lambda>>)
Profundidad del circuito de retorno (es decir, longitud del camino crítico).
La profundidad de un circuito cuántico es una medida de cuántas "capas" de puertas cuánticas, ejecutadas en paralelo, se necesitan para completar el cálculo definido por el circuito. Dado que las puertas cuánticas tardan tiempo en implementarse, la profundidad de un circuito corresponde aproximadamente a la cantidad de tiempo que tarda el ordenador cuántico en ejecutar el circuito.
Esta operación no está bien definida si el circuito contiene operaciones de flujo de control.
Parámetros
filter_function (Callable[[CircuitInstruction], bool]) – Una función para determinar qué instrucciones se tienen en cuenta a la hora de aumentar la profundidad. Debe aceptar como única entrada posicional un CircuitInstruction. Las instrucciones para las que la función devuelve un valor False se ignoran en el cálculo de la profundidad del circuito. De forma predeterminada, excluye las «directivas», como Barrier.
Devuelve
Profundidad del circuito.
Tipo de retorno
Ejemplos
Cálculo sencillo de la profundidad total del circuito:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(4)
qc.h(0)
qc.cx(0, 1)
qc.h(2)
qc.cx(2, 3)
assert qc.depth() == 2Modificación del ejemplo anterior para calcular únicamente la profundidad de las puertas multi-qubit:
assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1get_instructions
get_instructions(name)
Obtener instrucciones que coincidan con el nombre.
Parámetros
name (str) – El nombre de la instrucción que se desea obtener.
Devuelve
lista de (instrucción, qargs, cargs).
Tipo de retorno
num_connected_components
num_connected_components(unitary_only=False)
¿En cuántos subcircuitos no enredados se puede factorizar el circuito?
Parámetros
unitary_only (bool) – Calcular únicamente la parte unitaria del grafo.
Devuelve
Número de componentes conectados en el circuito.
Tipo de retorno
num_nonlocal_gates
num_nonlocal_gates()
Devuelve el número de puertas no locales (es decir, que implican 2+ qubits).
También se incluyen puertas condicionales no locales.
Tipo de retorno
num_tensor_factors
num_tensor_factors()
Calcula el número de factores tensoriales sólo en la parte unitaria (cuántica) del circuito.
Notas
Esto está aquí por compatibilidad con versiones anteriores, y se eliminará en una futura versión de Qiskit. Debería llamar a num_unitary_factors en su lugar.
Tipo de retorno
num_unitary_factors
num_unitary_factors()
Calcula el número de factores tensoriales sólo en la parte unitaria (cuántica) del circuito.
Tipo de retorno
size
size(filter_function=<function QuantumCircuit.<lambda>>)
Devuelve el número total de instrucciones en el circuito.
Parámetros
filter_function (callable) – una función para filtrar algunas instrucciones. Debe tomar como entrada una tupla de (Instrucción, lista(Qubit), lista(Clbit)). Por defecto, filtra las "directivas", como barrera o instantánea.
Devuelve
Número total de operaciones de puerta.
Tipo de retorno
width
width()
Devuelve el número de qubits más clbits del circuito.
Devuelve
Anchura del circuito.
Tipo de retorno
Acceso a la información sobre horarios
Si un QuantumCircuit se ha programado como parte de un canal de transpilación, se puede acceder a la información de temporización de qubits individuales. La información de temporización de todo el circuito está disponible a través del estimate_duration() método y op_start_times atributo.
estimate_duration
estimate_duration(target, unit='s')
Estimar la duración de un circuito programado
Este método calcula la estimación de la duración del circuito encontrando la ruta de mayor duración en el circuito basándose en las duraciones proporcionadas por un objetivo dado. Este método sólo funciona para circuitos sencillos que no tienen flujo de control u otras operaciones de feed-forward clásicas.
Parámetros
- target (Target) – Si el objetivo carece de datos de duración para cualquiera de las instrucciones del circuito,
QiskitErrorse generará una excepción enTargetla instancia que contiene las duraciones de las instrucciones. Este debería ser el mismo objeto de destino que se utiliza como destino para la transpilación. - unit (str) – La unidad en la que se devolverá la duración. El valor por defecto es «s» (segundos), pero puede ser cualquier prefijo del Sistema Internacional (SI) compatible con los resultados en segundos. Por ejemplo, si se establece este valor en «n», los resultados se mostrarán en nanosegundos. Los valores admitidos para este tipo son «f», «p», «n», «u», «µ», «m», «k», «M», «G», «T» y «P». Además, también se acepta el valor «dt» para generar un número entero en unidades de «dt». Para que esto funcione, hay que especificar «dt» en el archivo
target.
Devuelve
La duración estimada para la ejecución de un solo disparo del circuito en la unidad especificada.
Eleva
QiskitError - Si el circuito no está programado o contiene otros detalles que impiden calcular una duración estimada a partir de (como el retardo parametrizado).
Tipo de retorno
qubit_duration
qubit_duration(*qubits)
Devuelve la duración entre el tiempo de inicio y fin de la primera y la última instrucción, excluyendo retardos, sobre los qubits suministrados. Su unidad de tiempo es self.unit.
Parámetros
*qubits ( Qubit | int ) – Qubits que self se deben incluir.
Devuelve
Devuelve la duración entre la primera hora de inicio y la última hora de finalización de las instrucciones sin retardo
Tipo de retorno
qubit_start_time
qubit_start_time(*qubits)
Devuelve el tiempo de inicio de la primera instrucción, excluyendo retardos, sobre los qubits suministrados. Su unidad de tiempo es self.unit.
Devuelve 0 si no hay instrucciones sobre qubits
Parámetros
- *qubits - Qubits dentro de
selfpara incluir. Se admiten números enteros para los qubits, lo que indica - self.qubits. (indices of)
Devuelve
Devuelve el tiempo de inicio de la primera instrucción, excluyendo retardos, sobre los qubits
Eleva
CircuitError - si self es un circuito aún no programado.
Tipo de retorno
qubit_stop_time
qubit_stop_time(*qubits)
Devuelve el tiempo de parada de la última instrucción, excluyendo retardos, sobre los qubits suministrados. Su unidad de tiempo es self.unit.
Devuelve 0 si no hay instrucciones sobre qubits
Parámetros
- *qubits - Qubits dentro de
selfpara incluir. Se admiten números enteros para los qubits, lo que indica - self.qubits. (indices of)
Devuelve
Devuelve el tiempo de parada de la última instrucción, excluyendo retardos, sobre los qubits
Eleva
CircuitError - si self es un circuito aún no programado.
Tipo de retorno
Circuitos abstractos y físicos
Los circuitos son una abstracción de nivel bastante básico de los algoritmos cuánticos. Sin embargo, incluso dentro de este ámbito hay diferencias. Los programadores cuánticos suelen querer utilizar una amplia variedad de puertas e instrucciones, y trabajar en un régimen en el que todos los qubits interactúen entre sí. Sin embargo, el hardware cuántico suele tener un conjunto limitado de puertas nativas, y solo pueden interactuar determinados pares de qubits de hardware. Denominamos a estos dos regímenes «circuitos abstractos» y «circuitos físicos», respectivamente.
Qiskit tiene dos formas de distinguir un circuito que pretende ser físico. Se trata de una comprobación difusa, por razones históricas; originalmente, Qiskit nunca hizo distinción alguna (por eso transpile() se llama así, y no compile!). La forma más explícita es a través del atributo layout de los circuitos; si está activado, el circuito es ciertamente físico. La forma más antigua, más implícita, son los metadatos de los Qubit objetos e QuantumRegister instancias del circuito. Un circuito sólo puede considerarse físico (a juzgar por varias pasadas del transpilador) si contiene exactamente un registro cuántico, que se denomina q y posee todos los qubits del circuito en orden de índice. De nuevo por razones históricas, este es el valor por defecto para la forma QuantumCircuit(int [, int]) del constructor por defecto.
Normalmente, se crea un QuantumCircuit y lo construyes en sentido abstracto (sin tener en cuenta los metadatos del qubit). A continuación, llame a transpile() para compilar el circuito en un circuito compatible con hardware. Sin embargo, en los casos en los que quieras escribir un circuito eficiente en hardware desde el principio, puedes cortocircuitar toda la infraestructura de compilación utilizando el método ensure_physical() método. Esto garantizará que, independientemente de cómo hayas definido los metadatos qubit iniciales, se cumplan todos los requisitos para que el circuito se considere físico, con los índices qubit asignados a los qubits de hardware.
Para un control más completo sobre la elección de un mapeo y enrutamiento virtual a físico, consulte las etapas de mapeo y enrutamiento <transpiler-preset-stage-routing> de los pipelines de compilación de preajustes.
ensure_physical
ensure_physical(num_qubits=None, *, apply_layout=True)
Poner este circuito en forma física canónica, con el número dado de qubits, si no lo está ya.
Varios pases del transpilador Qiskit sólo tienen sentido cuando se aplican a circuitos definidos en términos de qubits físicos. Si ha construido manualmente un circuito en el que los índices de qubits corresponden a qubits físicos, utilice esta función para asegurarse de que los metadatos del circuito coinciden con la forma física canónica. Esto significa sustituir los datos de los qubits por un único registro propio llamado "q", y (opcionalmente) ajustar el layout del circuito para enlazar estos qubits físicos con los virtuales originales.
Si el circuito aún no tiene un diseño, este método (con apply_layout=True) equivale a aplicar el método de diseño trivial completo del canal de compilación preestablecido.
Si el circuito ya es canónicamente físico, no le pasa nada. Este método no puede cambiar el número de qubits del circuito si ya tiene un layout conjunto.
Parámetros
- num_qubits (int | None) – si se especifica, amplía el circuito con ancillas hasta este tamaño. Las ancillas siempre serán los índices de qubit más altos del circuito. Si no se especifica (valor por defecto), el circuito mantiene el mismo ancho. Esta opción no se puede configurar si el circuito ya tiene un
layout. - apply_layout (bool) – : si es verdadero (valor por defecto), configura el atributo
layoutdel circuito de forma adecuada para que parezca que se ha diseñado con la disposición «trivial», incluida la expansión de los circuitos auxiliares, para un backend de anchonum_qubits. Esto no tiene ningún efecto si el circuito ya tenía unlayout.
Devuelve
si se ha modificado el circuito para hacerlo físico.
Eleva
- ValueError : si
num_qubitses demasiado pequeño para el circuito. - CircuitError - si
num_qubitsestá configurado para intentar expandir el circuito, pero el circuito ya tiene un diseño configurado.
Tipo de retorno
estimate_fidelity
estimate_fidelity(target)
Calcula la fidelidad de un circuito físico.
Esta función calculará el producto de las tasas de error de cada puerta del circuito para estimar la fidelidad del mismo:
..matemáticas::
label
fidelidad estimada del circuito
prod_ {g in text{gates}} bigl(1 - nombre_del_operador {error} (g)bigr)
donde es la tasa de error en el objetivo para la instrucción procedente del circuito del objetivo. Si el circuito no es físico, es decir, si alguna instrucción del circuito (como «operation» y «qargs») no se encuentra en el destino, se devolverá None. Este método no tiene por objeto realizar una simulación realista de la fidelidad de la ejecución en hardware real. Está diseñado para ofrecer una estimación de cómo funcionaría el transpilador, teniendo en cuenta el grado de precisión de las distintas heurísticas en su funcionamiento. Por lo general, solo resulta útil para comparar entre sí los resultados de diferentes compilaciones, con el fin de estimar cuál de ellos produciría una ejecución de mejor calidad en el hardware.
Parámetros
target (Target) – La Target instancia en la que se ejecutará el circuito y que se utilizará para obtener las tasas de error de las instrucciones del circuito.
Devuelve
La fidelidad estimada de la ejecución del circuito en el objetivo dado. Si alguna instrucción del circuito no está presente en el destino
Eleva
QiskitError – Si el circuito contiene alguna operación de flujo de control.
Tipo de retorno
float | None
Métodos similares a las instrucciones
QuantumCircuit también contiene un pequeño número de métodos que, en cuanto a los detalles, se parecen mucho Instructiona... Es muy posible que consigas una mejor integración y una mayor compatibilidad con las API si primero conviertes tu circuito a un Instruction (to_instruction()) o Gate un (to_gate()), según corresponda, y luego llamas al método correspondiente.
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
Devuelve la versión controlada de este circuito.
El circuito original se convierte en una puerta lógica, y el circuito resultante contiene la versión controlada de dicha puerta. Esta puerta controlada se implementa como ControlledGate cuando annotated es False, y como AnnotatedOperation cuando annotated es True.
qiskit.circuit.quantumcircuit.QuantumCircuit.control()El argumento annotated está obsoleto a partir de Qiskit 2.3. Se eliminará en Qiskit 3.0. El método QuantumCircuit.control() ya no acepta annotated=None. El nuevo valor predeterminado es annotated=True, que representa la puerta controlada en el nuevo circuito cuántico como una puerta controlada ( AnnotatedOperation ), a menos que ya exista una clase de puerta controlada dedicada. Puede establecer explícitamente annotated=False para conservar el comportamiento anterior. Sin embargo, se recomienda utilizar annotated=True, ya que aplaza la construcción del circuito controlado al transpilador y, además, permite optimizaciones adicionales de la puerta controlada (lo que normalmente da lugar a circuitos de mayor calidad).
Parámetros
- num_ctrl_qubits (int) – Número de controles que se van a añadir. El valor predeterminado es
1. - label (str | None) – Una etiqueta opcional para identificar la compuerta controlada a efectos de visualización. El valor predeterminado es
None. Se ignora si la puerta controlada se implementa como una operación anotada. - ctrl_state (str |int | None) – El estado de control de la puerta, especificado como un número entero o como una cadena de bits (p. ej.,
"110"). SiNone, se establece por defecto en el estado en el que todos los bits son unos2**num_ctrl_qubits - 1. - annotated (bool | None) – Indica si la puerta controlada debe implementarse como una puerta controlada o como una operación anotada.
Devuelve
La versión controlada de este circuito.
Tipo de retorno
Eleva
CircuitError - Si el circuito contiene una operación no unitaria y no se puede controlar.
inverse
inverse(annotated=False)
Invierte (toma el adjunto de) este circuito.
Esto se hace invirtiendo recursivamente todas las puertas.
Parámetros
annotated (bool) – indica si la puerta inversa puede implementarse como una puerta anotada.
Devuelve
el circuito invertido
Tipo de retorno
Eleva
CircuitError - si no se puede invertir el circuito.
Ejemplos
input:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘Salida:
┌───┐
q_0: ──────■──────┤ H ├
┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
└───────────┘power
power(power, matrix_power=False, annotated=False)
Eleva este circuito a la potencia de power.
Si power es un número entero positivo y tanto matrix_power como annotated son False, esta implementación llama por defecto a repeat. En caso contrario, el circuito se convierte en una puerta y se devuelve un nuevo circuito que contiene esta puerta elevada a la potencia dada. La puerta elevada a la potencia dada se implementa como una puerta unitaria si annotated es False o como una operación anotada si annotated es True.
Parámetros
- power (float) – La potencia a la que se eleva este circuito.
- matrix_power (bool) – indica si la puerta de potencia interna puede implementarse como una puerta unitaria.
- annotated (bool) – indica si la puerta de potencia interna puede implementarse como una operación anotada.
Eleva
CircuitError - Si el circuito debe convertirse en una puerta unitaria, pero no es unitario.
Devuelve
Un circuito que implemente este circuito elevado a la potencia de power.
Tipo de retorno
repeat
repeat(reps, *, insert_barriers=False)
Repita este circuito reps veces.
Parámetros
- reps (int) – Con qué frecuencia debe repetirse este circuito.
- insert_barriers (bool) – Si se deben incluir barreras entre las repeticiones del circuito.
Devuelve
Un circuito que contiene reps repeticiones de este circuito.
Tipo de retorno
reverse_ops
reverse_ops()
Invierta el circuito invirtiendo el orden de las instrucciones.
Esto se hace invirtiendo recursivamente todas las instrucciones. No invierte (adjoint) ninguna puerta.
Devuelve
el circuito invertido.
Tipo de retorno
Ejemplos
input:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘Salida:
┌───┐
q_0: ─────■──────┤ H ├
┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
└──────────┘Visualización
Qiskit incluye algunas herramientas de dibujo para que te hagas una idea rápida del aspecto de tu circuito. Esta herramienta está destinada principalmente a producir un Matplotlib - o un dibujo basado en texto. También hay un backend LaTeX con menos funciones para dibujar, pero es sólo para circuitos sencillos y no se mantiene tan activamente.
La documentación principal para todas las herramientas de visualización de Qiskit.
draw
draw(output=None, scale=None, filename=None, style=None, interactive=False, plot_barriers=True, reverse_bits=None, justify=None, vertical_compression='medium', idle_wires=None, with_layout=True, fold=None, ax=None, initial_state=False, cregbundle=None, wire_order=None, expr_len=30, measure_arrows=None, barrier_label_len=16)
Dibuja el circuito cuántico. Utilice el parámetro de salida para elegir el formato de dibujo:
text
Arte ASCII TextDrawing que se puede imprimir en la consola.
mpl
Imágenes con colores generados exclusivamente en Python utilizando matplotlib.
latex
Imágenes de alta calidad recopiladas a través de LaTeX.
Esto, por su diseño, ejecutará una versión del pdflatex sistema instalada a partir de cualquier entrada del usuario (por ejemplo, para ejecutar código personalizado en Instruction.label), por lo que solo debe utilizarse con entradas de confianza.
latex_source
Salida sin procesar y sin compilar de « LaTeX ». Este es el código fuente de lo que mostraría el programa latex de dibujo.
La compatibilidad con Expr nodos en condiciones y campos SwitchCaseOp.target es preliminar e incompleta. Los cajones text y mpl se esforzarán al máximo por mostrar las dependencias de los datos, pero los cajones LaTeX-based las omitirán por completo.
Parámetros
-
output (str | None) – Selecciona el método de salida que se utilizará para dibujar el circuito. Las opciones válidas son
text,mpl,latex,latex_source. Por defecto, se utiliza eltextdrawer, a menos que el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) tenga un backend alternativo establecido como predeterminado. Por ejemplo,circuit_drawer = latex. Si se establece el parámetro «kwarg» de salida, siempre se utilizará ese backend en lugar del predeterminado en el archivo de configuración del usuario. -
scale (float | None) – Escala de la imagen que se va a dibujar (reducir si
< 1.0). Solo se utiliza en las salidaslatex_sourcempl, ylatex. El valor por defecto es1.0. -
filename (str | None) – Ruta del archivo en el que se guardará la imagen. Por defecto,
None(el resultado no se guarda en un archivo). -
Nombre del estilo, nombre del archivo JSON del estilo o un diccionario que especifique el estilo.
- Los nombres de estilo admitidos son
"iqp"(por defecto),"iqp-dark","clifford","textbook"y"bw". - Si se le da un fichero JSON, por ejemplo
my_style.jsonomy_style(la extensión.jsonpuede omitirse), esta función intenta cargar el diccionario de estilos desde esa ubicación. Tenga en cuenta que el archivo JSON debe especificar completamente las especificaciones de visualización. El archivo se busca enqiskit/visualization/circuit/styles, el directorio de trabajo actual y la ubicación especificada en~/.qiskit/settings.conf. - Si se trata de un diccionario, cada entrada anula la configuración predeterminada. Si se especifica la
"name"clave, la configuración predeterminada vendrá determinada por ese estilo. Por ejemplo,{"name": "textbook", "subfontsize": 5}carga el"textbook"estilo y establece el tamaño de la subfuente (por ejemplo, los ángulos de las compuertas) en5. - Si
Nonese utiliza el estilo por defecto"iqp"o, si se indica, el estilo por defecto especificado en~/.qiskit/settings.conf.
- Los nombres de estilo admitidos son
-
interactive (bool) – Cuando se establece en
True, muestra el circuito en una nueva ventana (para ellompl, es necesario que el backend de matplotlib utilizado admita esta función). Ten en cuenta que, si se utiliza con el tipo «texto» o con el tipolatex_source«salida», esto no tiene ningún efecto y se ignorará sin aviso. El valor por defecto esFalse. -
reverse_bits (bool | None) – Cuando se establece en
True, invierte el orden de los bits dentro de los registros para la visualización de la salida. El valor por defecto es aFalsemenos que el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) tenga establecido un valor alternativo. Por ejemplo,circuit_reverse_bits = True. -
plot_barriers (bool) – Activa o desactiva las barreras de dibujo en el circuito de salida. El valor predeterminado es
True. -
justify (str | None) – Las opciones son
"left", o"right""none"(str). Si se especifica cualquier otra opción, se utilizará la alineación a la izquierda. Se refiere a dónde deben colocarse las puertas en el circuito de salida, si existe esa opción.noneEsto hace que cada puerta se sitúe en su propia columna. El valor por defecto esleft. -
vertical_compression (str | None) –
high, omediumlow. Combina las líneas generadas por el texto resultante para que el dibujo ocupe menos espacio en vertical. El valor por defecto esmedium. Solo se utiliza en la salidatext; en caso contrario, se ignorará sin aviso. -
idle_wires (bool |str | None) – Incluir (o no) los cables inactivos (cables sin elementos de circuito) en la visualización de los resultados. También
"auto"es posible utilizar la cadena; en ese caso, se muestran los cables inactivos, salvo cuando el circuito tiene un esquema adjunto. El valor por defecto es, a menos"auto"que en el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) se haya establecido un valor alternativo. Por ejemplo,circuit_idle_wires = False. -
with_layout (bool) – Incluir información sobre la disposición, con etiquetas en la disposición física. El valor predeterminado es
True. -
fold (int | None) – Establece la paginación. Se puede desactivar utilizando el valor « -1 ». En
text, establece la longitud de las líneas. Esto resulta útil cuando el dibujo no cabe en la consola. Si se establece en «None» (valor predeterminado), intentará calcular el ancho de la consola utilizandoshutil.get_terminal_size(). Sin embargo, si se ejecuta en Jupyter, la longitud predeterminada de la línea está fijada en 80 caracteres. En este casompl, se trata del número de capas (visuales) antes del plegado. El valor por defecto es 25. -
ax (Any | None) – Solo utilizado por el backend mpl. Un objeto
matplotlib.axes.Axesopcional que se utilizará para la salida de visualización. Si no se especifica ninguno, se creará y utilizará una nueva figura matplotlib. Además, si se especifica, no habrá ninguna figura devuelta, ya que es redundante. -
initial_state (bool) – Añade al principio de los cables de qubit y a los cables clásicos. El valor predeterminado es
False. -
cregbundle (bool | None) – Si se establece en
True, se agrupan los registros clásicos. El valor por defecto esTrue, salvo cuandooutputestá configurado en"text". -
wire_order (list[int] | None) – Una lista de números enteros que se utiliza para reordenar la visualización de los bits. La lista debe contener una entrada para cada bit, y los bits deben estar comprendidos entre 0 y (
num_qubits+num_clbits). -
expr_len (int) – El número de caracteres que se mostrarán si
Exprse utiliza un para la condición en unControlFlowOp. Si se supera este número, la cadena se truncará en ese número y se añadirá «…» al final. -
measure_arrows (bool | None) – Si es verdadero, dibuja una flecha desde cada recuadro de medida hacia abajo, hasta el bit o registro clásico en el que se encuentra el valor de la medida. Si es «False», no dibujes la flecha, sino que introduce el nombre del bit o del registro en el cuadro de medida. El valor por defecto es, a menos
Trueque en el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) se haya establecido un valor alternativo. Por ejemplo,circuit_measure_arrows = False. -
barrier_label_len (int) – El número de caracteres que se mostrarán en las etiquetas
Barrierdel circuito de salida. Si se supera este número, la cadena se truncará en ese número y se añadirá «…» al final.
Devuelve
TextDrawing o matplotlib.figure o PIL.Image o str:
-
TextDrawing(sioutput='text')Un dibujo que puede imprimirse como arte ascii.
-
matplotlib.figure.Figure(sioutput='mpl')Un objeto figura matplotlib para el diagrama del circuito.
-
PIL.Image(sioutput='latex')Una representación en memoria de la imagen del circuito.
-
str(sioutput='latex_source')El código fuente LaTeX para visualizar el esquema del circuito.
Eleva
- VisualizationError - cuando se selecciona un método de salida no válido
- ImportError : cuando los métodos de salida requieren bibliotecas que no están instaladas.
Ejemplo
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
Además del controlador draw() hay dos métodos de ayuda relacionados con la visualización, que son útiles sobre todo para desenvolver rápidamente algunas instrucciones internas o invertir las convenciones de etiquetado de qubits en el dibujo. Para una mutación más general, incluida la reescritura de puertas base, debe utilizar el transpilador (qiskit.transpiler).
decompose
decompose(gates_to_decompose=None, reps=1)
Llama a un pase de descomposición en este circuito, para descomponer un nivel (descomposición superficial).
Parámetros
- gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – Subconjunto opcional de puertas que se van a descomponer. Puede ser un tipo de puerta, como
HGate, o el nombre de una puerta, como «h», o una etiqueta de puerta, como «Mi puerta H», o una lista que combine cualquiera de estos elementos. Si se introduce el nombre de una puerta, se desglosarán todas las puertas con ese nombre, independientemente de si tienen etiquetas o no. Por defecto, se aplican a todas las puertas del circuito. - reps (int) – Número opcional de veces que se debe descomponer el circuito. Por ejemplo,
reps=2equivale a llamar acircuit.decompose().decompose().
Devuelve
un circuito descompuesto en un nivel
Tipo de retorno
reverse_bits
reverse_bits()
Devuelve un circuito con el orden inverso de los cables.
El circuito está invertido "verticalmente". Si un circuito se define sobre varios registros, el circuito resultante tendrá los mismos registros pero con su orden invertido.
Este método es útil para convertir un circuito escrito en la convención little-endian a su equivalente big-endian, y viceversa.
Devuelve
el circuito con el orden de bits invertido.
Tipo de retorno
Ejemplos
input:
┌───┐
a_0: ┤ H ├──■─────────────────
└───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
└───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
└───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
└───┘┌─┴─┐
b_1: ────────────────────┤ X ├
└───┘Salida:
┌───┐
b_0: ────────────────────┤ X ├
┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
└───┘Parámetros