Skip to main content
IBM Quantum Platform

QuantumCircuit clase

class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

Bases: object

Representación en Qiskit de un circuito cuántico.

Nota

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 mutableResumen
global_phaseLa fase global del circuito, medida en radianes.
metadataAsignación arbitraria del usuario, que Qiskit conservará a través del transpilador, pero que por lo demás ignorará completamente.
nameUn nombre de cadena opcional para el circuito.
Atributo de datos inmutableResumen
ancillasLista de AncillaQubits rastreados por el circuito.
cregsLista de ClassicalRegisters rastreados por el circuito.
clbitsLista de Clbits rastreados por el circuito.
dataLista de individuos CircuitInstructions que componen el circuito.
durationDuración total del circuito, sumada por la programación de las pasadas del transpilador. Este atributo está obsoleto y estimate_duration() en su lugar.
layoutDiseño de hardware e información de enrutamiento añadida por el transpilador.
num_ancillasEl número de qubits ancilla del circuito.
num_clbitsEl número de clbits del circuito.
num_captured_varsNúmero de variables clásicas capturadas en tiempo real.
num_captured_stretchesNúmero de tramos capturados.
num_declared_varsNúmero de variables clásicas en tiempo real declaradas localmente en el ámbito del circuito exterior.
num_declared_stretchesNúmero de tramos declarados localmente en el ámbito del circuito exterior.
num_input_varsNúmero de variables clásicas de entrada en tiempo real.
num_parametersNúmero de comp Parameters en el circuito.
num_qubitsNúmero de qubits del circuito.
num_varsNúmero total de variables clásicas en tiempo real en el ámbito del circuito exterior.
num_stretchesNúmero total de tramos en el ámbito del circuito exterior.
num_identifiersNúmero total tanto de variables como de tramos en el circuito exterior.
op_start_timesHoras de inicio de las operaciones programadas, añadidas mediante la programación de pases del transpilador.
parametersVista ordenada en forma de conjunto de los Parameters rastreados por el circuito.
qregsLista de QuantumRegisters rastreados por el circuito.
qubitsLista de Qubits rastreados por el circuito.
unitLa 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.0
from numpy import pi
 
circuit.global_phase = pi/4
print(circuit.global_phase)
0.7853981633974483

La 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_circuit

Puede 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.

Obsoleto desde la versión 1.3.0

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.

Obsoleto desde la versión 1.3.0

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.

Nota

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: 2098

Devuelve

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: 1

num_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: 1

num_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étodoResumen
__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=())

GitHub

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 Register objetos, representa el QuantumRegister y/o ClassicalRegister objetos 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 qubits
      • QuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
    • Si una lista de listas python contiene Bit una colección de objetos Bit s 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 metadata atributo. No se utilizará directamente en el circuito.

  • inputs (Iterable[Var]) – cualquier variable que se deba declarar como input variable de tiempo de ejecución para este circuito. Estos ya deberían ser nodos expr.Var existentes que usted construye desde otro lugar; si necesita crear también las entradas, utilice QuantumCircuit.add_input(). Las variables proporcionadas en este argumento se pasarán directamente a add_input(). Un circuito no puede tener tanto inputs como captures.

  • 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 tanto inputs como captures.

  • 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

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)

GitHub

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

QuantumCircuit

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')

GitHub

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 .
Aviso

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 input en la fuente serán variables input en 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 que compose() 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

QuantumCircuit

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)

GitHub

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

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)

GitHub

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

QuantumCircuit

Consulte también

qasm2.load(): la interfaz completa del importador OpenQASM 2.

from_qasm_str

static from_qasm_str(qasm_str)

GitHub

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

QuantumCircuit

Consulte también

qasm2.loads(): la interfaz completa del importador OpenQASM 2.


Objetos de datos en circuitos

Añadir objetos de datos

MétodoAñ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

add_bits(bits)

GitHub

Añade Bits al circuito.

Aviso

Si el circuito cuántico tiene un atributo layout añadir un atributo Qubit sólo aumentará el número de qubits. No actualizará el diseño.

Parámetros

bits (Iterable[Bit]) –

Tipo de retorno

Ninguna

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)

GitHub

Añade registros.

Aviso

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)

GitHub

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 Var para 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 utilice expr.cast() para convertir el inicializador al tipo deseado.

    Debe ser un nodo Expr o un valor que se puede elevar a uno mediante expr.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

Var

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

GitHub

Registra una variable como entrada al circuito.

Parámetros

  • nombre_o_var - ya sea un nombre de cadena, o una existente Var existente a utilizar como variable de entrada.
  • tipo - si el nombre se da como una cadena, entonces este debe ser un Type para la variable. Si la variable se da como un Varno 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)

GitHub

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

Estiramiento

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, /)

GitHub

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.

Aviso

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)

GitHub

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)

GitHub

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.

Nota

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

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)

GitHub

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

bool

Trabajar con parámetros en tiempo de compilación

Consulte tambié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

GitHub

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.

Nota

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 True y parameters es un tipo de mapeo, se asume que es exactamente un mapeo de {parameter: value}. Por defecto (False), el mapeo también puede contener ParameterVector que apunten a una secuencia de valores correspondiente, y éstas se desenrollarán durante el mapeo, o claves de cadena, que se convertirán en Parameter mediante get_parameter().
  • strict - Si False, se ignorarán todos los parámetros indicados en la asignación que no se utilicen en el circuito. Si True (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')
Diagrama del circuito generado por el código anterior.Diagrama del circuito generado por el código anterior.

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')
Diagrama del circuito generado por el código anterior.Diagrama del circuito generado por el código anterior.

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, /)

GitHub

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

bool

Consulte también

QuantumCircuit.get_parameter()

Recupera la Parameter instancia de este circuito por su nombre.

QuantumCircuit.has_var()

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

GitHub

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 KeyError en 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_again

Obtiene 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 None
Consulte también

get_var()

Un método similar, pero para expr.Var variables en tiempo de ejecución en lugar de Parameter parámetros de compilación.

Trabajar con datos clásicos tecleados en tiempo real

Consulte también

qiskit.circuit.classical

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.

Añadir objetos de datos

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

GitHub

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 KeyError en 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_again

Obtiene 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 None
Consulte también

get_parameter()

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.

get_stretch

get_stretch(name: str, default: T) → Stretch | T

get_stretch(name: str, default: ellipsis = Ellipsis) → Stretch

GitHub

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 KeyError en 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_again

Obtiene 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 None

get_identifier

get_identifier(name: str, default: T) → Var | Stretch | T

get_identifier(name: str, default: ellipsis = Ellipsis) → Var | Stretch

GitHub

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 KeyError en su lugar.

Devuelve

La variable correspondiente.

Eleva

KeyError - si no se indica ningún valor por defecto, pero el identificador no existe.

Consulte también

get_var()

Obtiene un identificador conocido como expr.Var instancia.

get_stretch()

Obtiene un identificador conocido como expr.Stretch instancia.

get_parameter()

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, /)

GitHub

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

bool

Consulte también

QuantumCircuit.get_var()

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, /)

GitHub

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

bool

Consulte también

QuantumCircuit.get_stretch()

Recupera la expr.Stretch instancia de este circuito por su nombre.

has_identifier

has_identifier(name_or_ident, /)

GitHub

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

bool

Consulte también

QuantumCircuit.get_identifier()

Recuperar el expr.Var o expr.Stretch de este circuito por su nombre.

QuantumCircuit.has_var()

Igual que este método, pero ignorando todo lo que no sea una variable en tiempo de ejecución expr.Var .

QuantumCircuit.has_stretch()

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()

GitHub

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

Iterable[* Var* ]

iter_stretches

iter_stretches()

GitHub

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

Iterable[* Stretch* ]

iter_input_vars

iter_input_vars()

GitHub

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

Iterable[* Var* ]

iter_captured_vars

iter_captured_vars()

GitHub

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

Iterable[* Var* ]

iter_captured_stretches

iter_captured_stretches()

GitHub

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

Iterable[* Stretch* ]

iter_declared_vars

iter_declared_vars()

GitHub

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

Iterable[* Var* ]

iter_declared_stretches

iter_declared_stretches()

GitHub

Obtiene un iterable sobre todos los tramos declarados en este ámbito. Esto excluye los tramos capturados (véase iter_captured_stretches()).

Tipo de retorno

Iterable[* Stretch* ]


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.

Consulte también

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étodoCuá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)

GitHub

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

Devuelve

a los CircuitInstructions que se han añadido realmente al circuito.

Tipo de retorno

qiskit.circuit.InstructionSet

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

GitHub

Añade una instrucción al final del circuito, modificando el circuito en su lugar.

Aviso

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.
Nota

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 CircuitInstruction de la operación y su contexto a añadir.

    En la forma de compatibilidad heredada, puede ser un simple Operationen cuyo caso qargs y cargs deben indicarse explícitamente.

  • qargs - Argumento legado para qubits a los que adjuntar el bare Operation a. Se ignora si el primer argumento está en la forma preferente CircuitInstruction preferente.

  • cargs - Argumento de legado para clbits para adjuntar el bare Operation a. Se ignora si el primer argumento está en la forma preferente CircuitInstruction preferente.

Devuelve

un manejador de la instrucción que se acaba de añadir.

Tipo de retorno

CircuitInstruction

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

GitHub

Aplicar las instrucciones de un circuito a los qubits y/o clbits especificados en otro.

Nota

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():

  1. El circuito other se trata como totalmente aditivo, incluidas sus variables. Las variables de other deben ser totalmente distintas de las de self (utilice var_remap como ayuda), y todas las variables de other se declararán de nuevo en la salida con un ámbito de entrada/captura/local que coincida con el de other. Por lo general, esto es lo que quieres si vas a unir dos circuitos no relacionados.
  2. El circuito other fue creado como una extensión exacta de self para ser inlineado sobre él, incluyendo la actuación sobre las variables existentes en sus estados al final de self. En este caso, se debe crear other con todas estas variables a ser inlineadas declaradas como "captures", y luego se puede usar inline_captures=True en 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 argumento vars_mode="captures" de copy_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 que append acepte.

  • 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 a False si la entrada debe considerarse propiedad del circuito base, para evitar copias innecesarias; en este caso, no es válido utilizar other después, y algunas instrucciones pueden haber mutado en su lugar.

  • var_remap (Mapping) –

    para reescribir expr.Var y expr.Stretch en other a medida que se incorporan a self. 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 Var o Stretch con el mismo nombre. Si un valor es una cadena, cada vez que una nueva clave coincida con él, aparecerá un nuevo valor Var o Stretch con el tipo correcto. Si un valor es a Varsu type debe coincidir exactamente con el de la variable a la que sustituye.

  • inline_captures (bool) –

    si True, entonces todos los nodos identificadores "capturados" en other QuantumCircuit se supone que se refieren a identificadores ya declarados en self (como cualquier tipo de entrada/captura/local), y los usos en other se aplicarán a los identificadores existentes. Si quieres construir una capa para un circuito existente para usar con compose()puede que le resulte útil el argumento vars_mode="captures" de copy_empty_like() útil. Cualquier remapeo en vars_remap ocurre antes de evaluar esta variable inlining.

    Si es False (el valor predeterminado), se exigirá que todos los identificadores de other sean distintos de los de self, 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() o to_gate()y luego llamar a append().

Devuelve

el circuito compuesto (devuelve None si inplace==True).

Tipo de retorno

QuantumCircuit

Eleva

  • CircuitError - si no se puede realizar una asignación correcta de cables entre los dos circuitos, como por ejemplo si other es más ancho que self.
  • CircuitError - si se intenta emitir un nuevo circuito mientras self tiene activo un contexto de flujo de control parcialmente construido, como las formas de gestor de contexto de if_test(), for_loop() y while_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)

GitHub

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')
Diagrama del circuito generado por el código anterior.

Devuelve

El circuito tensado (devuelve None si inplace=True).

Tipo de retorno

QuantumCircuit

Parámetros

Como algunas reglas generales:

Algunos peligros potenciales con los que hay que tener cuidado:

  • Incluso si se reutiliza un Instruction durante 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 el to_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 poner inplace=True.
  • Tanto append() y compose() (pero no _append()) tienen un argumento de palabra clave copy que por defecto es True. En estos casos, las instancias Operation entrantes 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 configurar copy=False para 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:

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.

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)

GitHub

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

qiskit.circuit.InstructionSet

ccx

ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)

GitHub

Solicitar CCXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

ccz

ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CCZGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

ch

ch(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CHGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cp

cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CPhaseGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

crx

crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CRXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

llorar

cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CRYGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

crz

crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CRZGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cs

cs(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CSGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

csdg

csdg(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CSdgGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cswap

cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)

GitHub

Solicitar CSwapGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

csx

csx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CSXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cu

cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CUGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cx

cx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cy

cy(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CYGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

cz

cz(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

Solicitar CZGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

dcx

dcx(qubit1, qubit2)

GitHub

Solicitar DCXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

retraso

delay(duration, qarg=None, unit=None)

GitHub

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 tipo Duration.
  • qarg (Object) – qubit para aplicar este retardo.
  • unit (str | None) – unidad de la duración, a menos que duration sea una Expr en 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

qiskit.circuit.InstructionSet

Eleva

CircuitError - si los argumentos tienen mal formato.

ecr

ecr(qubit1, qubit2)

GitHub

Solicitar ECRGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

h

h(qubit)

GitHub

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

InstructionSet

id

id(qubit)

GitHub

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

InstructionSet

inicializar

initialize(params, qubits=None, normalize=False)

GitHub

Inicializar qubits en un estado específico.

La inicialización de los qubits se realiza primero reseteando los qubits a 0|0\rangle 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 1|1\rangle y el qubit uno en 0|0\rangle.
    • Un entero que se utiliza como un mapa de bits que indica qué qubits inicializar a 1|1\rangle. Ejemplo: establecer params a 5 inicializaría el qubit 0 y el qubit 2 a 1|1\rangle y el qubit 1 a 0|0\rangle.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits a inicializar. Si None la 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 (01)/2(|0\rangle - |1\rangle) / \sqrt{2}.

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 10|10\rangle. 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)

GitHub

Solicitar iSwapGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

mcp

mcp(lam, control_qubits, target_qubit, ctrl_state=None)

GitHub

Solicitar MCPhaseGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

mcrx

mcrx(theta, q_controls, q_target, use_basis_gates=False)

GitHub

Aplicar puerta de rotación X de control múltiple

Parámetros

mcry

mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)

GitHub

Aplicar puerta de rotación Y de control múltiple

Parámetros

mcrz

mcrz(lam, q_controls, q_target, use_basis_gates=False)

GitHub

Aplicar puerta de rotación Z de control múltiple

Parámetros

mcx

mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)

GitHub

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.

Obsoleto desde la versión 2.1

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

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

InstructionSet

medida

measure(qubit, cbit)

GitHub

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 0\lvert 0 \rangle o 1\lvert 1 \rangle. 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

Devuelve

asa a las instrucciones añadidas.

Tipo de retorno

qiskit.circuit.InstructionSet

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/══════╩═
           0

Es 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)

GitHub

Solicitar MSGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

p

p(theta, qubit)

GitHub

Solicitar PhaseGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

pauli

pauli(pauli_string, qubits)

GitHub

Solicitar PauliGate.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

preparar_estado

prepare_state(state, qubits=None, label=None, normalize=False)

GitHub

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 1|1\rangle y el qubit uno en 0|0\rangle.
    • Un entero que se utiliza como un mapa de bits que indica qué qubits inicializar a 1|1\rangle. Ejemplo: establecer params a 5 inicializaría el qubit 0 y el qubit 2 a 1|1\rangle y el qubit 1 a 0|0\rangle.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits a inicializar. Si None la 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

InstructionSet

Ejemplos

Prepara un qubit en el estado (01)/2(|0\rangle - |1\rangle) / \sqrt{2}.

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 10|10\rangle. 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)

GitHub

Solicitar RGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rcccx

rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)

GitHub

Solicitar RC3XGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rccx

rccx(control_qubit1, control_qubit2, target_qubit)

GitHub

Solicitar RCCXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

restablecer

reset(qubit)

GitHub

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

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit)

GitHub

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 vv, donde v|v| es el ángulo de rotación en radianes.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rx

rx(theta, qubit, label=None)

GitHub

Solicitar RXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rxx

rxx(theta, qubit1, qubit2)

GitHub

Solicitar RXXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

ry

ry(theta, qubit, label=None)

GitHub

Solicitar RYGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

ryy

ryy(theta, qubit1, qubit2)

GitHub

Solicitar RYYGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rz

rz(phi, qubit)

GitHub

Solicitar RZGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rzx

rzx(theta, qubit1, qubit2)

GitHub

Solicitar RZXGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

rzz

rzz(theta, qubit1, qubit2)

GitHub

Solicitar RZZGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

s

s(qubit)

GitHub

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

InstructionSet

sdg

sdg(qubit)

GitHub

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

InstructionSet

tienda

store(lvalue, rvalue, /)

GitHub

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 Var pero también se puede escribir en Clbit o ClassicalRegister ubicaciones 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

InstructionSet

Consulte también

Store

La clase Instruction que representa esta operación.

add_var()

Crea una nueva variable en el circuito en la que se pueda escribir con este método.

intercambio

swap(qubit1, qubit2)

GitHub

Solicitar SwapGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

sx

sx(qubit)

GitHub

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

InstructionSet

sxdg

sxdg(qubit)

GitHub

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

InstructionSet

t

t(qubit)

GitHub

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

InstructionSet

tdg

tdg(qubit)

GitHub

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

InstructionSet

u

u(theta, phi, lam, qubit)

GitHub

Solicitar UGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

unitario

unitary(obj, qubits, label=None)

GitHub

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

QuantumCircuit

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)

GitHub

Solicitar XGate.

Para ver la forma matricial completa de esta puerta, consulte la documentación de la puerta subyacente.

Parámetros

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

y

y(qubit)

GitHub

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

InstructionSet

z

z(qubit)

GitHub

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

InstructionSet

Añadir flujo de control a los circuitos

Consulte también

Flujo de control en circuitos

Debate sobre cómo se representan las operaciones de flujo de control en todo el qiskit.circuit contexto.

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)

GitHub

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 QuantumCircuit posicionalmente, y las qubits y clbits sobre las que actúa. En esta forma, se crea inmediatamente un BoxOp se crea inmediatamente y se añade utilizando el circuito como cuerpo.
  • Utilícelo en una sentencia with sin body, qubits o clbits. Este es el "formulario de interfaz del constructor", en el que luego se utilizan otros QuantumCircuit métodos dentro del ámbito Python with para añadir instrucciones al box. 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 QuantumCircuit se pasa posicionalmente, se utiliza inmediatamente como cuerpo de la caja, y también deben especificarse qubits y clbits . Si no se indica, o si se indica un iterable de objetos Annotation se activa la forma de gestor de contexto de este método.
  • qubits (Sequence[QubitSpecifier] | None) – los qubits a los que aplicar el BoxOp en la forma explícita.
  • clbits (Sequence[ClbitSpecifier] | None) – los qubits a los que aplicar el BoxOp en 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 Annotation objetos 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()

GitHub

Solicitar BreakLoopOp.

Aviso

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

InstructionSet

continue_loop

continue_loop()

GitHub

Solicitar ContinueLoopOp.

Aviso

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

InstructionSet

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

GitHub

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 body al que se asignarán los valores de indexset . 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 sentencia with . Sólo se incorporará al circuito si se utiliza dentro del cuerpo.

    Si este argumento es None en la forma manual de este método, body se repetirá una vez para cada uno de los elementos de indexset pero 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)

GitHub

Solicitar IfElseOp.

Nota

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

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

InstructionSet

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

GitHub

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 de ClassicalRegister para comprobar la igualdad con un determinado int, o como una tupla de Clbit para compararla con bool o int.
  • true_body (Optional[QuantumCircuit]) – El cuerpo del circuito que se ejecutará si condition es 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

GitHub

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_DEFAULT coincide 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

GitHub

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 a ClassicalRegister o a Clbity 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)

GitHub

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()

GitHub

Comprueba si el circuito tiene una instancia de ControlFlowOp presente entre sus operaciones.

Tipo de retorno

bool

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)

GitHub

Cree un Instruction de este circuito.

Consulte también

circuit_to_instruction()

El motor subyacente de este método.

Parámetros

Devuelve

una instrucción compuesta que encapsula este circuito (puede ser

espalda descompuesta).

Tipo de retorno

qiskit.circuit.Instruction

to\gate

to_gate(parameter_map=None, label=None)

GitHub

Cree un Gate de este circuito. El circuito debe actuar sólo sobre qubits y contener únicamente operaciones unitarias.

Consulte también

circuit_to_gate()

El motor subyacente de este método.

Parámetros

Devuelve

una puerta compuesta que encapsula este circuito (puede descomponerse de nuevo).

Tipo de retorno

Puerta

Además, puede convertir todo el circuito en la DAGCircuit representación:

a_dag

to_dag(*, copy_operations=True)

GitHub

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

qiskit.dagcircuit.DAGCircuit

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)

GitHub

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

QuantumCircuit

measure_all

measure_all(inplace=True, add_bits=True)

GitHub

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

QuantumCircuit

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()

GitHub

Borrar todas las instrucciones en uno mismo.

Al borrar los circuitos se conservarán los metadatos.

Consulte también

copy_empty_like()

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)

GitHub

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)

Nota

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.

Consulte también

RemoveFinalMeasurements

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

QuantumCircuit


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')
Diagrama del circuito generado por el código anterior.

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() == 12

También podemos obtener directamente el número de qubits utilizando num_qubits:

assert qc.num_qubits == 12
Importante

Para 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() == 19

count\ops

count_ops()

GitHub

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>>)

GitHub

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.

Aviso

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

int

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() == 2

Modificación del ejemplo anterior para calcular únicamente la profundidad de las puertas multi-qubit:

assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1

obtener_instrucciones

get_instructions(name)

GitHub

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

lista (tupla )

número_componentes_conectados

num_connected_components(unitary_only=False)

GitHub

¿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

int

número_puertas_no_locales

num_nonlocal_gates()

GitHub

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

int

num_tensor_factors

num_tensor_factors()

GitHub

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

int

num_unitary_factors

num_unitary_factors()

GitHub

Calcula el número de factores tensoriales sólo en la parte unitaria (cuántica) del circuito.

Tipo de retorno

int

tamaño

size(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

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

int

anchura

width()

GitHub

Devuelve el número de qubits más clbits del circuito.

Devuelve

Anchura del circuito.

Tipo de retorno

int

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')

GitHub

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 Target que 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 mensaje QiskitError . 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

int | float

qubit_duration

qubit_duration(*qubits)

GitHub

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

Float

qubit_start\_time

qubit_start_time(*qubits)

GitHub

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 self para 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

Float

qubit_stop_time

qubit_stop_time(*qubits)

GitHub

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 self para 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

Float


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)

GitHub

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 layout del 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 anchura num_qubits. Esto no tiene ningún efecto si el circuito ya tenía un layout.

Devuelve

si se ha modificado el circuito para hacerlo físico.

Eleva

  • ValueError - si num_qubits es demasiado pequeño para el circuito.
  • CircuitError - si num_qubits está configurado para intentar expandir el circuito, pero el circuito ya tiene un diseño configurado.

Tipo de retorno

bool


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)

GitHub

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.

Obsoleto desde la versión 2.3

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"). Si None, se establece por defecto en el estado «todos 2**num_ctrl_qubits - 1 unos».
  • 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

QuantumCircuit

Eleva

CircuitError - Si el circuito contiene una operación no unitaria y no se puede controlar.

inversa

inverse(annotated=False)

GitHub

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

QuantumCircuit

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)

GitHub

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

QuantumCircuit

repeat

repeat(reps, *, insert_barriers=False)

GitHub

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

QuantumCircuit

reverse_ops

reverse_ops()

GitHub

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

QuantumCircuit

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.

Consulte también

qiskit.visualization

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)

GitHub

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.

Aviso

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ón text a menos que el archivo de configuración del usuario (normalmente ~/.qiskit/settings.conf) tenga un backend alternativo establecido como predeterminado. Por ejemplo, circuit_drawer = latex. Si se establece el 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 salidas mpl, latex y latex_source . Por defecto 1.0.

  • filename (str | None) – Ruta de archivo donde guardar la imagen. Por defecto None (el resultado no se guarda en un archivo).

  • style (dict |str | None) –

    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.json o my_style (la extensión .json puede 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 en qiskit/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) en 5.
    • Si None se utiliza el estilo por defecto "iqp" o, si se indica, el estilo por defecto especificado en ~/.qiskit/settings.conf.
  • interactive (bool) – Cuando se establece en True, muestra el circuito en una nueva ventana (para mpl esto 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 o latex_source no tiene ningún efecto y se ignorará silenciosamente. Por defecto False.

  • 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 es False a 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. none hace que cada puerta se coloque en su propia columna. Por defecto left.

  • vertical_compression (str | None) – high, medium o low. Fusiona las líneas generadas por la salida de texto para que el dibujo ocupe menos espacio vertical. Por defecto es medium. Sólo utilizado por la salida text , 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 utilizando shutil.get_terminal_size(). Sin embargo, si se ejecuta en jupyter, la longitud de línea por defecto es de 80 caracteres. En mpl, 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.Axes opcional 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 0|0\rangle al principio de los hilos qubit y 00 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 es True, excepto cuando output se 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 Expr se utiliza para la condición en un ControlFlowOp. 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 True a 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 (si output='text')

    Un dibujo que puede imprimirse como arte ascii.

  • matplotlib.figure.Figure (si output='mpl')

    Un objeto figura matplotlib para el diagrama del circuito.

  • PIL.Image (si output='latex')

    Una representación en memoria de la imagen del circuito.

  • str (si output='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'})
Diagrama del circuito generado por el código anterior.

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)

GitHub

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=2 equivale a llamar a circuit.decompose().decompose().

Devuelve

un circuito descompuesto en un nivel

Tipo de retorno

QuantumCircuit

reverse_bits

reverse_bits()

GitHub

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

QuantumCircuit

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

¿Le ha resultado útil esta página?
Informe de un error, errata o solicite contenidos en GitHub .