QuantumCircuit clase
class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Bases: object
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 individuos CircuitInstructions que componen el circuito. |
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 | Número de comp Parameters 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 | Vista ordenada en forma de conjunto de los Parameters rastreados por 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 de tipo secuencia que expone los CircuitInstructions contenidos en una forma ordenada. Generalmente no se debe mutar este objeto directamente; QuantumCircuit sólo está diseñado para operaciones de adición (que deben utilizar append()). La mayoría de las operaciones que mutan circuitos in situ deben escribirse como pases de transpilador (qiskit.transpiler).
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 en forma de lista que contiene las CircuitInstruction instancias del circuito.
Junto a la datael global_phase de un circuito puede tener algún impacto en su salida, si el circuito se utiliza para describir una Gate que puede ser controlado. 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.7853981633974483La dirección name de un circuito se convierte en el nombre del Instruction o Gate resultante de to_instruction() y to_gate() lo que puede resultar útil para las visualizaciones.
nombre
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.
metadatos
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 expone atributos de datos rastreando sus bits y registros internos cuánticos y clásicos. Aparecen como Python lists, pero debe tratarlos como inmutables; cambiarlos , en el mejor de los casos, no tendrá ningún efecto, y lo más probable es que simplemente corrompa los datos internos del archivo 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 en tiempo de compilación presentes en las instrucciones del circuito están disponibles en parameters. Este tiene un orden canónico (mayoritariamente léxico, excepto en el caso de ParameterVector), que coincide con el orden en que se asignarán los parámetros cuando se utilicen las formas de lista de assign_parameters()pero también admite set-como prueba de pertenencia en tiempo constante.
parámetros
Los parámetros definidos en el circuito.
Este atributo devuelve los Parameter objetos del circuito ordenados alfabéticamente. Tenga en cuenta que los parámetros instanciados con un ParameterVector siguen estando ordenados 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 puede utilizarse.
>>> 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 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 TranspileLayout opcional. Suele establecerse en la salida de transpile() o PassManager.run() para retener información sobre las permutaciones causadas en el circuito de entrada por la transpilación.
Hay dos tipos de permutaciones causadas por la función transpile() una disposición inicial que permuta los qubits basándose en los qubits físicos seleccionados en la función Targety una disposición final, que es una permutación de salida causada por SwapGates 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.
duración
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.
unidad
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_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 establece, se asignará una cadena generada automáticamente.
-
global_phase (ParameterExpression |float) – La fase global del circuito en radianes.
-
metadata (dict | None) – Metadatos de valor de clave arbitraria para asociar con el circuito. Esto se almacena como datos de forma libre en un dict en el atributo
metadataatributo. No se utilizará directamente en el circuito. -
inputs (Iterable[Var]) – cualquier variable que se deba declarar como
inputvariable de tiempo de ejecución para este circuito. Estos ya deberían ser nodosexpr.Varexistentes que usted construye desde otro lugar; si necesita crear también las entradas, utiliceQuantumCircuit.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 capturar de un ámbito contenedor. 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 dará al circuito copiado. Si es Ninguno, el nombre permanece igual.
Devuelve
una copia profunda del circuito actual, con el nombre especificado
Tipo de retorno
Del mismo modo, si desea un circuito que contenga todos los mismos objetos de datos (bits, registros, variables, etc) pero sin ninguna de las instrucciones, puede utilizar copy_empty_like(). Esto es bastante común cuando se desea construir una nueva capa de un circuito para luego utilizar aplicar en la parte posterior con compose()o para reescribir completamente 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 Ninguno, el nombre permanece 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 para todo un contexto de circuito, y luego construir un circuito a partir de ella. El constructor from_instructions() capturará automáticamente todas las Qubit y Clbit utilizadas en las instrucciones, y creará un nuevo objeto QuantumCircuit que tiene los recursos correctos 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 para 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 de valor de clave arbitraria para asociar con el circuito.
Devuelve
El circuito cuántico.
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) – Ruta de acceso al archivo de un programa 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 OpenQASM 2.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) – una cadena con el nombre de la variable o una instancia existente de
Varpara 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
- nombre_o_var - ya sea un nombre de cadena, o una existente
Varexistente a 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.
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.
add_stretch
add_stretch(name_or_stretch)
Declara un nuevo tramo para este circuito.
Parámetros
name_or_stretch (str |Stretch) – una cadena con el nombre del stretch o una instancia existente de Stretch para reutilizar. Los estiramientos no pueden imitar 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
A Bit es, por sí misma, un identificador único que los circuitos pueden utilizar en sus propios contextos. Si tiene una Bit y un circuito, basta con encontrar los contextos en los que existe el bit utilizando find_bit()como su índice entero en el circuito y los registros que contiene.
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, Lista[Tuple (Registro, 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 común sobre Parameter es sustituirlas en operaciones simbólicas por algún valor numérico u otra expresión simbólica. Esto se hace con assign_parameters().
asignar_parámetros
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 diccionario, las claves deben ser Parameter instancias en el circuito actual. Los valores del diccionario pueden ser valores numéricos o nuevos objetos de parámetro.
Si parameters se pasa como lista o matriz, los elementos se asignan a los parámetros actuales en el orden de parameters que se ordena alfabéticamente (respetando el orden en los objetos ParameterVector objetos).
Los valores pueden asignarse al objeto circuito actual o a una copia del mismo.
Cuando se proporciona parameters como asignación, se permite que las claves sean cadenas de los nombres de los parámetros; éstas se buscarán utilizando get_parameter(). También puede tener claves que sean ParameterVector instancias, y en este caso, el valor del diccionario debe ser una secuencia de valores de la misma longitud que el vector.
Si utiliza cualquiera de estos casos, debe dejar el ajuste flat_input=False; cambiándolo a True se activa la ruta rápida, en la que todas las claves deben ser Parameter instancias.
Parámetros
- parameters - Un diccionario o iterable que especifica los nuevos valores de los parámetros.
- inplace - Si es False, se devuelve una copia del circuito con los parámetros vinculados. Si es True, se modifica el propio circuito.
- flat_input - Si
Trueyparameterses un tipo de mapeo, se asume que es exactamente un mapeo de{parameter: value}. Por defecto (False), el mapeo también puede contenerParameterVectorque apunten a una secuencia de valores correspondiente, y éstas se desenrollarán durante el mapeo, o claves de cadena, que se convertirán enParametermedianteget_parameter(). - strict - Si
False, se ignorarán todos los parámetros indicados en la asignación que no se utilicen en el circuito. SiTrue(por defecto), se producirá un error indicando un error lógico.
Eleva
- CircuitError - Si parameters es un dict y contiene parámetros no presentes en el circuito.
- ValueError - Si los parámetros son una lista/array y la longitud no coincide con el número de parámetros libres en el circuito.
Devuelve
Una copia del circuito con parámetros vinculados si inplace es False, en caso contrario None.
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 rastrea los parámetros por Parameter instancias mismas, y prohíbe tener múltiples parámetros del mismo nombre para evitar algunos problemas al interoperar con OpenQASM u otros formatos externos. Puede utilizar has_parameter() y get_parameter() para buscar en el circuito un parámetro con el nombre de cadena dado.
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 nombre de un parámetro a comprobar. Si se trata de un Parameter nodo, el parámetro debe ser exactamente el dado 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.
Un método similar a este, pero para variables en tiempo de ejecución expr.Var en lugar de en tiempo de compilación Parameters.
get_parameter
get_parameter(name: str, default: T) → Parameter | T
get_parameter(name: str, default: ellipsis = Ellipsis) → Parameter
Recupera un parámetro en tiempo de compilación accesible en este ámbito de circuito por su nombre.
Parámetros
- name - el nombre del parámetro a recuperar.
- default - si se da, este valor será devuelto si el parámetro no está presente. Si no se indica, se genera un
KeyErroren su lugar.
Devuelve
El parámetro correspondiente.
Eleva
KeyError - si no se indica ningún valor por defecto, pero el parámetro no existe en el circuito.
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 is 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) is my_param
assert qc.get_parameter("unknown_param", None) is NoneTrabajar con datos clásicos tecleados 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: ellipsis = Ellipsis) → Var
Recupera una variable accesible en este ámbito de circuito por su nombre.
Parámetros
- name - el nombre de la variable a recuperar.
- default - si se da, se devolverá este valor si la variable no está presente. Si no se indica, se genera un
KeyErroren su lugar.
Devuelve
La variable correspondiente.
Eleva
KeyError - si no se indica 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 is 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) is 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: ellipsis = Ellipsis) → Stretch
Recupera un tramo accesible en este ámbito de circuito por su nombre.
Parámetros
- name - el nombre del tramo a recuperar.
- default - si se da, se devolverá este valor si la variable no está presente. Si no se indica, se genera un
KeyErroren su lugar.
Devuelve
El tramo correspondiente.
Eleva
KeyError - si no se indica 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 is 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) is 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: ellipsis = 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 - el nombre del identificador a recuperar.
- default - si se da, se devolverá este valor si la variable no está presente. Si no se indica, se genera un
KeyErroren su lugar.
Devuelve
La variable correspondiente.
Eleva
KeyError - si no se indica 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 en tiempo de compilación en lugar de expr.Var variables en 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 una 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()
Un método similar a éste, pero para tiempo de compilación Parameteren lugar de variables expr.Var variables.
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 nombre de un tramo que se debe comprobar. Si se trata de un expr.Stretch nodo, el estiramiento debe ser exactamente el dado 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 nodo expr.Varexpr.Stretch o, la instancia coincidente debe ser exactamente la dada 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()
Un método similar a éste, pero para tiempo de compilación Parameteren lugar de variables expr.Var variables.
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
Puede añadir cualquier cosa que implemente la interfaz Operation a un circuito como una única instrucción, aunque la mayoría de las cosas que querrá añadir serán Instruction o Gate instancias.
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 única instrucción u operación aparece como una única entrada en el data del circuito, y como una sola caja cuando se dibuja en los visualizadores de circuitos (véase draw()). Una única instrucción es la "unidad" en términos de la cual puede definirse un hardware backend (véase Target). Un Instruction puede ir acompañado de un definitionque es una regla a la que el transpilador (véase qiskit.transpiler) para descomponerlo en hardware, si es necesario. Un Operation que no sea también un Instruction sólo puede descomponerse si tiene registrado algún método de síntesis de alto nivel asociado (véase qiskit.transpiler.passes.synthesis.plugin).
A QuantumCircuit por sí solo no es un Instructiones bastante más complicado, ya que, en general, puede representar un programa completo con entradas y salidas de memoria clásicas tipificadas y flujo de control. El modelo de datos de Qiskit (y de la mayoría del hardware) aún no tiene el concepto de subrutinas reutilizables con operandos cuánticos virtuales. Se pueden convertir circuitos sencillos que actúan sólo sobre qubits con operaciones unitarias en un Gate utilizando to_gate()y los circuitos simples que actúan sólo sobre qubits y clbits en a Instruction con to_instruction().
Cuando tenga un Operation, Instructiono Gateañádalo al circuito, especificando los argumentos qubit y clbit con append().
añadir
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.
Las direcciones qargs y cargs se ampliarán y difundirán de acuerdo con las normas del dado Instructiony cualquier especificador noBit (como índices enteros) se resolverán en las instancias pertinentes.
Si se proporciona un objeto CircuitInstruction se desenvolverá, se verificará en el contexto de este circuito y se añadirá un nuevo objeto al circuito. En este caso, no puede pasar qargs o cargs por separado.
Parámetros
- instruction (Operation |CircuitInstruction) –
Instructiona añadir, o unCircuitInstructioncon todo su contexto. - qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – especificadores de los
Qubits a los que adjuntar la instrucción. - cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – especificadores de los
Clbits a los que adjuntar la instrucción. - copy (bool) – si
True(por defecto), entonces elinstructionentrante es copiado antes de añadirlo al circuito si contiene parámetros simbólicos, por lo que puede ser mutado de forma segura sin afectar a otros circuitos en los que pueda estar la misma instrucción. Si está seguro de que esta instrucción no estará en otros circuitos, puede configurar esteFalsepara un pequeño aumento de velocidad.
Devuelve
a los CircuitInstructions que se han añadido realmente al circuito.
Tipo de retorno
Eleva
CircuitError - si la operación pasada no es una instancia de Instruction .
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 -
Una descripción completa y bien formada
CircuitInstructionde la operación y su contexto a añadir.En la forma de compatibilidad heredada, puede ser un simple
Operationen cuyo casoqargsycargsdeben indicarse explícitamente. -
qargs - Argumento legado para qubits a los que adjuntar el bare
Operationa. Se ignora si el primer argumento está en la forma preferenteCircuitInstructionpreferente. -
cargs - Argumento de legado para clbits para adjuntar el bare
Operationa. Se ignora si el primer argumento está en la forma preferenteCircuitInstructionpreferente.
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.
componer
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 componer sobre sí mismo. Si no es un
QuantumCircuitpuede ser cualquier cosa queappendacepte. -
qubits (list[Qubit|int]) – qubits de uno mismo para componer.
-
clbits (list[Clbit|int]) – trozos de sí mismo para componer.
-
front (bool) – Si
True, se realizará la composición frontal. Esto no es posible en los gestores de contexto de los constructores de flujo de control. -
inplace (bool) – Si
True, modifique el objeto. De lo contrario, devuelva el circuito compuesto. -
copy (bool) – Si
True(el valor por defecto), entonces la entrada se trata como compartida, y cualquier instrucción contenida se copiará, si puede ser que necesite ser mutada en el futuro. Puede establecerlo aFalsesi la entrada debe considerarse propiedad del circuito base, para evitar copias innecesarias; en este caso, no es válido utilizarotherdespués, y algunas instrucciones pueden haber mutado en su lugar. -
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 True, envuelve el otro circuito en una puerta (o instrucción, dependiendo de si contiene sólo instrucciones unitarias) antes de componerlo sobre sí mismo. En lugar de utilizar esta opción, casi siempre es mejor controlarlo manualmente utilizando
to_instruction()oto_gate()y luego 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
True, modifique el objeto. En caso 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 tiene un
Operation,InstructionoGatedebe utilizarappend()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:
- Incluso si se reutiliza un
Instructiondurante la construcción del circuito, el transpilador generalmente tendrá que "desenrollar" cada invocación del mismo a su descomposición interna antes de empezar a trabajar en él. Esto no debería impedirle utilizar elto_instruction()-más-append()ya que el transpilador mejorará 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()ycompose()(pero no_append()) tienen un argumento de palabra clavecopyque por defecto esTrue. En estos casos, las instanciasOperationentrantes se copiarán si Qiskit detecta que los objetos tienen mutabilidad sobre ellos (como tomar parámetros de puerta). Si está seguro de que no volverá a reutilizar los objetos en otros lugares, debería configurarcopy=Falsepara evitar esta copia, que puede suponer un aumento sustancial de la velocidad en el caso de objetos de gran tamaño.
Métodos para añadir instrucciones estándar
La clase QuantumCircuit tiene métodos de ayuda para añadir muchas de las instrucciones y puertas de la biblioteca estándar de Qiskit a un circuito. Por lo general, equivalen a crear manualmente una instancia del objeto qiskit.circuit.library y pasarlo a append() con el resto de argumentos colocados en los campos qargs y cargs según corresponda.
Los siguientes métodos aplican operaciones especiales no unitarias Instruction al circuito:
QuantumCircuit método | qiskit.circuit Instruction |
|---|---|
barrier() | Barrier |
delay() | Delay |
initialize() | Initialize |
measure() | Measure |
reset() | Reset |
store() | Store |
Estos métodos aplican instancias unitarias Gate al circuito:
Se aplican los siguientes métodos Gate que también son puertas controladas, por lo que son subclases directas de ControlledGate:
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.
QuantumCircuit método | Base qiskit.circuit.library Gate |
|---|---|
mcp() | PhaseGate |
mcrx() | RXGate |
mcry() | RYGate |
mcrz() | RZGate |
mcx() | XGate |
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.
barrera
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)
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 qubit o qubits utilizados como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits utilizados como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla en el estado '1'.
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 qubit o qubits utilizados como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits utilizados como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "10"). Por defecto se controla 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 o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 la rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 la rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla en el estado '1'.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
llorar
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 la rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 la rotación.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 o los qubits utilizados 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 en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo,
'1'). Control por defecto en el 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 o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 de la puerta U, si se aplica.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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 o los qubits utilizados como control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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]) – Los qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla 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]) – Los qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla en el estado '1'.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
dcx
dcx(qubit1, qubit2)
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 qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
retraso
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 la duración, a menos que
durationsea unaExpren cuyo caso no debe especificarse. Unidades soportadas:'s','ms','us','ns','ps', y'dt'. Por defecto es'dt', es decir, unidad de tiempo entera dependiendo 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)
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]) – Los qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Los qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
h
h(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
id
id(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
inicializar
initialize(params, qubits=None, normalize=False)
Inicializar qubits en un estado específico.
La inicialización de los qubits se realiza primero reseteando los qubits a seguido de una llamada a la clase StatePreparation para preparar los qubits en un estado especificado. Ambos pasos están incluidos en las Initialize instrucción.
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, Y. Consulte
Statevector.from_label(). Obsérvese que el orden de las etiquetas se invierte con respecto al índice del qubit al que se aplican. La etiqueta de ejemplo'01'inicializa el qubit cero en y el qubit uno en . - 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) – Si se normaliza 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) ├
└──────────────────────────────┘Inicializar a partir de una cadena dos qubits en el estado . El orden de las etiquetas se invierte con respecto al índice del qubit. 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)
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]) – Los qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Los qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
mcp
mcp(lam, control_qubits, target_qubit, ctrl_state=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 la 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 qubits a los que se dirige la puerta.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla en el estado '1'.
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 la 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) – utilizar puertas base p, u, 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 la 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 a utilizar.
- use_basis_gates (bool) – utilizar puertas base p, u, 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 la 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) – utilizar puertas base p, u, cx.
mcx
mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=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 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 los requiere.
- mode (str | None) – La elección del modo, explicada más arriba.
- ctrl_state (str |int | None) – El estado de control en decimal, o como una cadena de bits (por ejemplo, "1"). Por defecto se controla en el estado '1'.
Devuelve
Un handle a las instrucciones creadas.
Eleva
- ValueError - si no se conoce el modo dado, o si se pasan muy pocos qubits ancilla.
- AttributeError - si no se pasan qubits ancilla, pero se necesitan algunos.
Tipo de retorno
medida
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) a medir.
- cbit (Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]) – bit(s) clásico(s) en el(los) que colocar el(los) resultado(s) de la medición.
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)
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 la rotación.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
p
p(theta, qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
pauli
pauli(pauli_string, qubits)
Solicitar PauliGate.
Parámetros
- pauli_string (str) – Una cadena que representa el operador Pauli a aplicar, por ejemplo 'XX'.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits a los que aplicar esta puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
preparar_estado
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, Y. Consulte
Statevector.from_label(). Obsérvese que el orden de las etiquetas se invierte con respecto al índice del qubit al que se aplican. La etiqueta de ejemplo '01' inicializa el qubit cero en y el qubit uno en . - 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 puerta
-
normalize (bool) – Si se normaliza 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) ├
└─────────────────────────────────────┘Preparar a partir de una cadena dos qubits en el estado . El orden de las etiquetas se invierte con respecto al índice del qubit. 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)
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 la 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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rcccx
rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)
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 qubit o qubits utilizados como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits utilizados como segundo control.
- control_qubit3 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits utilizados como tercer control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rccx
rccx(control_qubit1, control_qubit2, target_qubit)
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 qubit o qubits utilizados como primer control.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits utilizados como segundo control.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que se dirige la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
restablecer
reset(qubit)
Restablece los bits cuánticos a su estado por defecto.
Parámetros
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit(s) a reiniciar.
Devuelve
a la instrucción añadida.
Tipo de retorno
rv
rv(vx, vy, vz, qubit)
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 qubits a los que aplicar la puerta.
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 puerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rxx
rxx(theta, qubit1, qubit2)
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 la rotación.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
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 puerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
ryy
ryy(theta, qubit1, qubit2)
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 puerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rz
rz(phi, qubit)
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 puerta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rzx
rzx(theta, qubit1, qubit2)
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 puerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
rzz
rzz(theta, qubit1, qubit2)
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 puerta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
s
s(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sdg
sdg(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
tienda
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 Instruction que representa esta operación.
Crea una nueva variable en el circuito en la que se pueda escribir con este método.
intercambio
swap(qubit1, qubit2)
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]) – Los qubits a los que aplicar la puerta.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Los qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sx
sx(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
sxdg
sxdg(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
t
t(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
tdg
tdg(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
u
u(theta, phi, lam, qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
unitario
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 [Por defecto: Ninguno].
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 qubits a los que aplicar la puerta.
- label (str | None) – La etiqueta de cadena de la puerta en el circuito.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
y
y(qubit)
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 qubits a los que aplicar la puerta.
Devuelve
Un handle a las instrucciones creadas.
Tipo de retorno
z
z(qubit)
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 qubits a los que aplicar la puerta.
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 con sólo un cuerpo True |
if_else() | IfElseOp tanto con True como con False |
while_loop() | WhileLoopOp |
switch() | SwitchCaseOp |
for_loop() | ForLoopOp |
box() | BoxOp |
break_loop() | BreakLoopOp |
continue_loop() | ContinueLoopOp |
QuantumCircuit tiene métodos correspondientes para todas las operaciones de flujo de control soportadas por Qiskit. Estos tienen dos formas de llamarlos. La primera es una envoltura muy sencilla que toma los cuerpos de bloque de las instrucciones como argumentos y simplemente construye y añade el bloque correspondiente QuantumCircuit como argumentos, y simplemente construye y añade los correspondientes archivos ControlFlowOp.
La segunda forma, que recomendamos encarecidamente utilizar para construir el flujo de control, se denomina interfaz del constructor. Aquí, los métodos sólo toman el discriminante en tiempo real de la operación, y devuelven gestores de contexto que se introducen mediante with. A continuación, puede utilizar métodos QuantumCircuit dentro de esos bloques para construir los cuerpos del flujo de control, y Qiskit rastreará automáticamente cuáles de los recursos de datos son necesarios para los bloques internos, construyendo el completo ControlFlowOp a medida que abandonas la sentencia with . Es mucho más sencillo y menos propenso a errores construir el flujo de control programáticamente 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.
Para comprobar si un circuito contiene un ControlFlowOp puede utilizar el método auxiliar QuantumCircuit.has_control_flow_op().
caja
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:
- Pase un
QuantumCircuitposicionalmente, y lasqubitsyclbitssobre las que actúa. En esta forma, se crea inmediatamente unBoxOpse crea inmediatamente y se añade utilizando el circuito como cuerpo. - 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 a
QuantumCircuitse pasa posicionalmente, se utiliza inmediatamente como cuerpo de la caja, y también deben especificarsequbitsyclbits. Si no se indica, o si se indica un iterable de objetosAnnotationse activa la forma de gestor de contexto de este método. - qubits (Sequence[QubitSpecifier] | None) – los qubits a los que aplicar el
BoxOpen la forma explícita. - clbits (Sequence[ClbitSpecifier] | None) – los qubits a los que aplicar el
BoxOpen la 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 se limitan a programar el ámbito contenido para que coincida con una duración determinada, incluida 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
Annotationobjetos que deba tener la caja. Cuando este método se utiliza en forma de gestor de contexto, este argumento puede pasarse como único argumento posicional.
break_loop
break_loop()
Solicitar BreakLoopOp.
Si utiliza las formas "constructoras" del gestor de contexto de if_test(), for_loop() o while_loop(), sólo puede llamar a este método si se encuentra dentro de un contexto de bucle, porque de lo contrario no se puede determinar el "ancho de recurso" de la operación. Esto llevaría rápidamente a circuitos inválidos, por lo que si está intentando construir un cuerpo de bucle reutilizable (sin los gestores de contexto), debe utilizar también la forma sin gestor de contexto de if_test() y if_else(). Tenga en cuenta que la instrucción BreakLoopOp debe abarcar todos los recursos del bucle que la contiene, no sólo 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 utiliza las formas "constructoras" del gestor de contexto de if_test(), for_loop() o while_loop(), sólo puede llamar a este método si se encuentra dentro de un contexto de bucle, porque de lo contrario no se puede determinar el "ancho de recurso" de la operación. Esto llevaría rápidamente a circuitos inválidos, por lo que si está intentando construir un cuerpo de bucle reutilizable (sin los gestores de contexto), debe utilizar también la forma sin gestor de contexto de if_test() y if_else(). Tenga en cuenta que la instrucción ContinueLoopOp debe abarcar todos los recursos del bucle que la contiene, no sólo 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 | None, body: None, qubits: None, clbits: None, *, label: str | None) → ForLoopContext
for_loop(indexset: Iterable[int], loop_parameter: Parameter | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
Crea un bucle for en este circuito.
Existen dos formas de llamar a esta función. Si se invoca con todos sus argumentos (con la posible excepción de label), creará un archivo ForLoopOp con la dirección body. Si no se pasa body (y qubits y clbits), entonces esto actúa como un gestor de contexto, el cual, cuando se introduce, proporciona una variable de bucle (a menos que se dé una, en cuyo caso se reutilizará) y construirá automáticamente una variable de bucle ForLoopOp 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.
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 enteros sobre la que hacer un bucle. Siempre es necesario.
-
loop_parameter (Optional[Parameter]) –
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, o bien un gestor de contexto para crear el bucle for (se añadirá automáticamente al circuito al final del bloque), o bien un InstructionSet handle a la operación de bucle añadido.
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[qiskit.circuit.ClassicalRegister, int] | tuple[qiskit.circuit.Clbit, int] | tuple[qiskit.circuit.Clbit, bool]) – Una condición que se evaluará en tiempo real durante la ejecución del circuito y que, si es verdadera, activará la evaluación de
true_body. Se puede especificar como una tupla de unClassicalRegisterque se va a comprobar si es igual a un dadoint, o como una tupla de unClbitque se va a comparar con unboolo unint. - 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 se debe ejecutar el if/else.
- clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – Los clbits del circuito sobre los que se debe ejecutar el 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[qiskit.circuit.ClassicalRegister | qiskit.circuit.Clbit, int]) → IfContext
if_test(condition: tuple[qiskit.circuit.ClassicalRegister | qiskit.circuit.Clbit, int], 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.
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 IfElseOp con el true_body dado, y no habrá bifurcación para la condición false (véase también el método if_else() ). Sin embargo, si true_body (y qubits y clbits ) no se pasan, entonces esto actúa como un administrador de contexto, que se puede usar para construir if declaraciones. El valor de retorno de la sentencia with es un gestor de contexto encadenable, que puede utilizarse para crear bloques else posteriores. De esta forma, no necesitas llevar la cuenta de los qubits o clbits que estás utilizando, porque el scope lo hará 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 (Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición que se evaluará en tiempo real durante la ejecución del circuito y que, si es verdadera, desencadenará la evaluación de
true_body. Puede especificarse como una tupla deClassicalRegisterpara comprobar la igualdad con un determinadoint, o como una tupla deClbitpara compararla conbooloint. - 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 firma de la llamada, o bien un gestor de contexto para crear el bloque if (se añadirá automáticamente al circuito al final del bloque), o bien un InstructionSet handle a 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.
interruptor
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: None, qubits: None, clbits: None, *, label: str | None) → SwitchContext
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], 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) → InstructionSet
Cree una estructura switch/case en este circuito.
Existen dos formas de llamar a esta función. Si se invoca con todos sus argumentos (con la posible excepción de label), creará un archivo SwitchCaseOp con la estructura de casos dada. Si no se pasa cases (y qubits y clbits), entonces esto actúa como un gestor de contexto, que construirá automáticamente un SwitchCaseOp cuando finalice el ámbito. 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, 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 (Union[ClassicalRegister, Clbit]) – El valor clásico para cambiar uno. Debe ser de tipo entero.
- 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[qiskit.circuit.ClassicalRegister | qiskit.circuit.Clbit, int] | Expr, body: None, qubits: None, clbits: None, *, label: str | None) → WhileLoopContext
while_loop(condition: tuple[qiskit.circuit.ClassicalRegister | qiskit.circuit.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) → 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 (Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición de igualdad que debe comprobarse antes de ejecutar
body. El lado izquierdo de la condición debe ser aClassicalRegistero aClbity el lado derecho debe ser un entero o un booleano. - 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 se pueda pasar como un qubit o colección de qubits es válida para cada argumento aquí.
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 tiene una instancia de ControlFlowOp presente entre sus operaciones.
Tipo de retorno
Conversión de circuitos a otros objetos
Como se ha comentado en Métodos para sumar operaciones generales, se puede convertir un circuito en un Instruction o un Gate utilizando dos métodos de ayuda.
to_instruction
to_instruction(parameter_map=None, label=None)
Cree un Instruction de este circuito.
circuit_to_instruction()
El motor subyacente de este método.
Parámetros
- parameter_map (dict[qiskit._accelerate.circuit.Parameter, Union[qiskit._accelerate.circuit.ParameterExpression, float]] | None) – Para circuitos parametrizados, una asignación de los parámetros del circuito a los parámetros que se utilizarán en la instrucción. Si es Ninguno, los parámetros de circuito existentes también parametrizarán la instrucción.
- label (str | None) – Etiqueta de puerta opcional.
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)
Cree un Gate de este circuito. El circuito debe actuar sólo sobre qubits y contener únicamente operaciones unitarias.
circuit_to_gate()
El motor subyacente de este método.
Parámetros
- parameter_map (dict[qiskit._accelerate.circuit.Parameter, Union[qiskit._accelerate.circuit.ParameterExpression, float]] | None) – Para circuitos parametrizados, una asignación de los parámetros del circuito a los parámetros que se utilizarán en la puerta. Si
None, los parámetros del circuito existente también parametrizarán la puerta. - label (str | None) – Etiqueta de puerta opcional.
Devuelve
una puerta compuesta que encapsula este circuito (puede descomponerse de nuevo).
Tipo de retorno
Además, puede convertir todo el circuito en la DAGCircuit representación:
a_dag
to_dag(*, copy_operations=True)
Convierta este circuito a un DAGCircuit.
Se trata de un sencillo envoltorio alrededor de circuit_to_dag().
Parámetros
copy_operations (bool) – si se deben copiar en profundidad las instrucciones individuales. Si se establece en False, la operación es más económica, pero las mutaciones en las instrucciones del DAG afectarán al circuito original.
Devuelve
un DAG que representa este mismo circuito.
Tipo de retorno
Helper mutation methods
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 en el lugar o volver 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 en el lugar o volver nuevo circuito.
- add_bits (bool) – Si se añaden 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.
Hay dos métodos "sustractivos" en QuantumCircuit también. Este no es un caso de uso para el que QuantumCircuit para el que está diseñado; lo normal es utilizar copy_empty_like() en lugar de clear()y ejecutar remove_final_measurements() como su forma de paso de transpilador RemoveFinalMeasurements.
claro
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
eliminar_medidas_finales
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 retiradas en el lugar o volver nuevo circuito.
Devuelve
Devuelve el circuito resultante si inplace=False, si no Ninguno.
Tipo de retorno
Propiedades del circuito
Simple circuit metrics
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 de cuántas operaciones de cada tipo, ordenadas por importe.
Tipo de retorno
OrderedDict
profundidad
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 decidir qué instrucciones cuentan para aumentar la profundidad. Debe tomar como única entrada posicional a CircuitInstruction. Las instrucciones para las que la función devuelve False se ignoran en el cálculo de la profundidad del circuito. Por defecto, filtra las "directivas", tales 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) == 1obtener_instrucciones
get_instructions(name)
Obtener instrucciones que coincidan con el nombre.
Parámetros
name (str) – El nombre de la instrucción a.
Devuelve
lista de (instrucción, qargs, cargs).
Tipo de retorno
número_componentes_conectados
num_connected_components(unitary_only=False)
¿En cuántos subcircuitos no enredados se puede factorizar el circuito?
Parámetros
unitary_only (bool) – Calcular sólo la parte unitaria del grafo.
Devuelve
Número de componentes conectados en el circuito.
Tipo de retorno
número_puertas_no_locales
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
tamaño
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
anchura
width()
Devuelve el número de qubits más clbits del circuito.
Devuelve
Anchura del circuito.
Tipo de retorno
Acceder a la información de programación
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.
estimación_duración
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) – La instancia
Targetque contiene las duraciones de las instrucciones, si al objetivo le faltan datos de duración para alguna de las instrucciones del circuito, se producirá un mensajeQiskitError. Debe ser el mismo objeto de destino utilizado para la transpilación. - unit (str) – La unidad para devolver la duración en. Por defecto es "s" para los segundos, pero puede ser un prefijo SI compatible para las devoluciones de segundos. Por ejemplo, si se establece en "n", se obtendrá la unidad de nanosegundos. Los valores admitidos de este tipo son "f", "p", "n", "u", "µ", "m", "k", "M", "G", "T" y "P". Además, también se acepta un valor de "dt" para dar salida a un número entero en unidades de "dt". Para que funcione, debe especificarse "dt" en
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 dentro self 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 bajo nivel de los algoritmos cuánticos. Sin embargo, incluso dentro de esto, hay distinciones. Los programadores cuánticos suelen querer utilizar una amplia gama de puertas e instrucciones, y trabajar en un régimen en el que todos los qubits interactúan con todos los demás. El hardware cuántico, sin embargo, suele tener un conjunto restrictivo de puertas nativas, y sólo ciertos pares de qubits del hardware pueden interactuar. 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 da, amplía el circuito con ancillas hasta este tamaño. Las ancillas serán siempre los índices de qubit más altos del circuito. Si no se especifica (por defecto), el circuito mantiene la misma anchura. Esta opción no se puede establecer si el circuito ya como un
layout. - apply_layout (bool) – si es verdadero (por defecto), establece el atributo
layoutdel circuito de forma que el circuito parezca haber sido diseñado con el diseño "trivial", incluida la expansión ancilla, para un backend de anchuranum_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
Métodos similares a la instrucción
QuantumCircuit también contiene un pequeño número de métodos muy Instruction-similares en detalle. Es muy posible que encuentres una mejor integración y más soporte API si primero conviertes tu circuito en un circuito Instruction (to_instruction()) o Gate (to_gate()), según corresponda, y luego llamar 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, y el circuito resultante contiene la versión controlada de esta 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. Por defecto a
1. - label (str | None) – Etiqueta opcional para dar a la puerta controlada una 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 una cadena de bits (por ejemplo,
"110"). SiNone, se establece por defecto en el estado «todos2**num_ctrl_qubits - 1unos». - 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.
inversa
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) – El poder de elevar este circuito a.
- matrix_power (bool) – indica si la puerta de potencia interior puede implementarse como una puerta unitaria.
- annotated (bool) – indica si la puerta de alimentación 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)
Dibuja el circuito cuántico. Utilice el parámetro de salida para elegir el formato de dibujo:
texto : Arte ASCII TextDrawing que se puede imprimir en la consola.
mpl : imágenes con color renderizadas puramente en Python usando matplotlib.
látex : imágenes de alta calidad compiladas mediante látex.
latex_source : salida de látex sin compilar.
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) – Seleccione el método de salida que desea utilizar para dibujar el circuito. Las opciones válidas son
text,mpl,latex,latex_source. Por defecto, se utiliza el cajóntexta 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 kwarg de salida, siempre se utilizará ese backend sobre el predeterminado en el archivo de configuración de usuario. -
scale (float | None) – Escala de la imagen a dibujar (encoge si
< 1.0). Sólo utilizado por las salidasmpl,latexylatex_source. Por defecto1.0. -
filename (str | None) – Ruta de archivo donde 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 es un diccionario, cada entrada anula la configuración por defecto. Si se da la clave
"name", la configuración por defecto viene dada por ese estilo. Por ejemplo,{"name": "textbook", "subfontsize": 5}carga el estilo"texbook"y establece el tamaño de subfondo (por ejemplo, los ángulos de la puerta) 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 (paramplesto depende de que el backend matplotlib que se utilice lo soporte). Tenga en cuenta que cuando se utiliza con el tipo de salida de texto olatex_sourceno tiene ningún efecto y se ignorará silenciosamente. Por defectoFalse. -
reverse_bits (bool | None) – Cuando se establece en
True, invierte el orden de bits dentro de los registros para la visualización de salida. Por defecto esFalsea menos que el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) tenga un valor alternativo. Por ejemplo,circuit_reverse_bits = True. -
plot_barriers (bool) – Activa/desactiva las barreras de dibujo en el circuito de salida. El valor predeterminado es
True. -
justify (str | None) – Las opciones son
"left","right"o"none"(str). Si se suministra cualquier otra cosa, se utilizará la justificación a la izquierda. Se refiere a dónde deben colocarse las compuertas en el circuito de salida si existe la opción.nonehace que cada puerta se coloque en su propia columna. Por defectoleft. -
vertical_compression (str | None) –
high,mediumolow. Fusiona las líneas generadas por la salida de texto para que el dibujo ocupe menos espacio vertical. Por defecto esmedium. Sólo utilizado por la salidatext, se ignorará silenciosamente en caso contrario. -
idle_wires (bool |str | None) – Incluir (o no) los hilos ociosos (hilos sin elementos de circuito) en la visualización de la salida. También es posible la cadena
"auto", en cuyo caso se muestran los cables inactivos excepto que el circuito tiene un diseño adjunto. Por defecto es"auto"a menos que el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) tenga un valor alternativo. Por ejemplo,circuit_idle_wires = False. -
with_layout (bool) – Incluya información sobre el diseño, con etiquetas en el diseño físico. El valor predeterminado es
True. -
fold (int | None) – Establece la paginación. Puede desactivarse mediante -1. En
text, establece la longitud de las líneas. Esto es útil cuando el dibujo no cabe en la consola. Si es Ninguno (por defecto), intentará adivinar el ancho de la consola utilizandoshutil.get_terminal_size(). Sin embargo, si se ejecuta en jupyter, la longitud de línea por defecto es de 80 caracteres. Enmpl, es el número de capas (visuales) antes del plegado. 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 hilos qubit y a los hilos clásicos. El valor predeterminado es
False. -
cregbundle (bool | None) – Si se establece en
True, agrupa los registros clásicos. Por defecto esTrue, excepto cuandooutputse establece en"text". -
wire_order (list[int] | None) – Una lista de enteros utilizada para reordenar la visualización de los bits. La lista debe tener una entrada para cada bit con los bits en el rango de 0 a (
num_qubits+num_clbits). -
expr_len (int) – El número de caracteres a mostrar si se utiliza un
Exprse utiliza 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 True, dibuja una flecha desde cada casilla de medida hasta el bit o registro clásico donde se coloca el valor de la medida. Si es False, no dibuje la flecha, pero en su lugar coloque el nombre del bit o registro en la casilla de medida. Por defecto es
Truea menos que el archivo de configuración del usuario (normalmente~/.qiskit/settings.conf) tenga un valor alternativo. Por ejemplo,circuit_measure_arrows = False.
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 no 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 a descomponer. Puede ser un tipo de puerta, como
HGate, o un nombre de puerta, como "h", o una etiqueta de puerta, como "Mi puerta H", o una lista de cualquier combinación de estos. Si se introduce un nombre de puerta, se descompondrán todas las puertas con ese nombre, tengan o no etiquetas. Por defecto, todas las puertas del circuito. - reps (int) – Número opcional de veces que debe descomponerse 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