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

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 mutable
Resumen
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 inmutable
Resumen
ancillasLista de AncillaQubits rastreados por el circuito.
cregsLista de ClassicalRegisters rastreados por el circuito.
clbitsLista de Clbits rastreados por el circuito.
dataLista de las CircuitInstruction personas que forman parte del circuito.
_dataReferencia de Python a los datos subyacentes nativos de Rust, utilizada por el objeto QkCircuit de la API de C.
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_parametersParameterNúmero de «s» en tiempo de compilación que hay 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.
parametersParameterVista ordenada, similar a un conjunto, de los valores de tiempo de compilación que sigue 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 similar a una secuencia que muestra los CircuitInstructionelementos que contiene de forma ordenada. Por lo general, no se debe modificar este objeto directamente; QuantumCircuit está diseñado únicamente para operaciones de solo añadir (para las que se debe utilizar append()). La mayoría de las operaciones que modifican circuitos in situ deben escribirse como pasadas del transpilador (qiskit.transpiler). La API de C interactúa con un objeto interno, denominado _data, que no forma parte de la API pública de Python, salvo como identificador que se pasa a las llamadas a la API de C.

data

Los datos del circuito (instrucciones y contexto).

Ejemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)
qc.measure([0], [1])
print(qc.data)
[CircuitInstruction(operation=Instruction(name='measure', num_qubits=1,
num_clbits=1, params=[]), qubits=(Qubit(QuantumRegister(2, 'q'), 0),),
clbits=(Clbit(ClassicalRegister(2, 'c'), 1),))]

Devuelve

Un objeto similar a una lista que contiene las CircuitInstruction instancias del circuito.

_data

Tipo: CircuitData

Un manipulador opaco al objeto nativo de Rust subyacente QuantumCircuit.

Este objeto se corresponde directamente con el objeto de la API de C QkCircuit.

Aviso

Ningún elemento de este objeto, salvo su propia existencia, forma parte de la API pública de Python.

Hay muy pocos usos válidos de este objeto en Python. Puedes pasárselo a funciones que esperan el tipo de la API de C QkCircuit, como aquellas que llamarán a qk_circuit_borrow_from_python(); puedes utilizarlo como un passmanager.IR; puedes reconstruir el circuito completo con QuantumCircuit.from_circuit_data().

Además de data, la global_phase de un circuito puede influir en cierta medida en su salida, si el circuito se utiliza para describir un Gate que pueda controlarse. Se mide en radianes y se puede ajustar directamente.

global_phase

La fase global del alcance del circuito actual en radianes.

Ejemplo

from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)
0.0
from numpy import pi

circuit.global_phase = pi/4
print(circuit.global_phase)
0.7853981633974483

El name nombre de un circuito pasa a ser el nombre de la función Instruction o Gate del resultado derivado de to_instruction() las llamadas a y to_gate() , lo cual puede resultar útil para las visualizaciones.

name

Tipo: str

Un nombre legible para el circuito.

Ejemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_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.

metadata

Diccionario arbitrario de metadatos definido por el usuario para el circuito.

Qiskit no examinará el contenido de este mapeo, pero lo pasará a través del transpilador y lo volverá a adjuntar a la salida, por lo que puede realizar un seguimiento de sus propios metadatos.

Ejemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})

print(qc.metadata)
{'experiment_type': 'Bell state experiment'}

QuantumCircuit muestra los atributos de los datos que permiten realizar un seguimiento de sus bits y registros internos, tanto cuánticos como clásicos. Aunque parecen listobjetos de Python, debes tratarlos como inmutables; modificarlos, en el mejor de los casos, no tendrá ningún efecto y, lo más probable, es que simplemente dañe los datos internos del QuantumCircuit.

qregs

Una lista de Qubits en el orden en que fueron añadidos. No debes mutar esto.

cregs

Una lista de Clbits en el orden en que fueron añadidos. No debes mutar esto.

qubits

Una lista de Qubits en el orden en que fueron añadidos. No debes mutar esto.

ancillas

Una lista de AncillaQubits en el orden en que fueron añadidos. No debes mutar esto.

clbits

Una lista de Clbits en el orden en que fueron añadidos. No debes mutar esto.

Ejemplo

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit

qr1 = QuantumRegister(2)
qr2 = QuantumRegister(1)
cr1 = ClassicalRegister(2)
cr2 = ClassicalRegister(1)
qc = QuantumCircuit(qr1, qr2, cr1, cr2)

print("List the qubits in this circuit:", qc.qubits)
print("List the classical bits in this circuit:", qc.clbits)
List the qubits in this circuit: [Qubit(QuantumRegister(2, 'q0'), 0),
Qubit(QuantumRegister(2, 'q0'), 1), Qubit(QuantumRegister(1, 'q1'), 0)]
List the classical bits in this circuit: [Clbit(ClassicalRegister(2, 'c0'), 0),
Clbit(ClassicalRegister(2, 'c0'), 1), Clbit(ClassicalRegister(1, 'c1'), 0)]

Los parámetros de tiempo de compilación presentes en las instrucciones del circuito están disponibles en parameters. Esto tiene un orden canónico (principalmente léxico, salvo en el caso de ParameterVector), que coincide con el orden en que se asignarán los parámetros al utilizar las formas de lista de assign_parameters(), pero también admite comprobaciones de pertenencia en tiempo constante, setal estilo de.

parameters

Los parámetros definidos en el circuito.

Este atributo devuelve los Parameter objetos del circuito ordenados alfabéticamente. Ten en cuenta que los parámetros instanciados con un ParameterVector siguen ordenándose numéricamente.

Ejemplos

El siguiente fragmento muestra que el orden de inserción de los parámetros no importa.

>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
>>> circuit = QuantumCircuit(1)
>>> circuit.rx(b, 0)
>>> circuit.rz(elephant, 0)
>>> circuit.ry(a, 0)
>>> circuit.parameters  # sorted alphabetically!
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])

Tenga en cuenta que la ordenación alfabética puede resultar poco intuitiva cuando se trata de números. El "10" literal va antes que el "2" en estricta ordenación alfabética.

>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
>>> circuit = QuantumCircuit(1)
>>> circuit.u(*angles, 0)
>>> circuit.draw()
   ┌─────────────────────────────┐
q: ┤ U(angle_1,angle_2,angle_10) ├
   └─────────────────────────────┘
>>> circuit.parameters
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])

Para respetar la ordenación numérica, se puede utilizar un ParameterVector .

>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
>>> x = ParameterVector("x", 12)
>>> circuit = QuantumCircuit(1)
>>> for x_i in x:
...     circuit.rx(x_i, 0)
>>> circuit.parameters
ParameterView([
    ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
    ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
    ..., ParameterVectorElement(x[11])
])

Devuelve

Los objetos ordenados Parameter en el circuito.

Si has transpilado tu circuito, de modo que tienes un circuito físico, puedes inspeccionar el atributo layout para obtener información almacenada por el transpilador sobre cómo los qubits virtuales del circuito fuente se corresponden con los qubits hardware de tu circuito físico, tanto al principio como al final del circuito.

layout

Devuelve cualquier información de diseño asociada sobre el circuito.

Este atributo contiene un objeto opcional TranspileLayout . Normalmente se establece en la salida de transpile() o PassManager.run() para conservar la información sobre las permutaciones provocadas en el circuito de entrada por la transpilación.

Hay dos tipos de permutaciones provocadas por la transpile() función: una disposición inicial que permuta los qubits en función de los qubits físicos seleccionados en la Target, y una disposición final, que es una permutación de salida provocada por SwapGatelos s insertados durante el enrutamiento.

Ejemplo

from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager

# Create circuit to test transpiler on
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.swap(1, 2)
qc.cx(0, 1)

# Add measurements to the circuit
qc.measure([0, 1, 2], [0, 1, 2])

# Specify the QPU to target
backend = GenericBackendV2(3)

# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled = pass_manager.run(qc)

# Print the layout after transpilation
print(transpiled.layout.routing_permutation())
[0, 1, 2]

Si su circuito también se programó como parte de una transpilación, se expondrán los tiempos individuales de cada instrucción, junto con el total duration del circuito.

duration

La duración total del circuito, fijada por un pase del transpilador de programación. Su unidad se especifica mediante unit.

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.

unit

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étodo
Resumen
__init__()Constructor por defecto de circuitos sin instrucciones.
copy()Haga una copia completa de un circuito existente.
copy_empty_like()Copia objetos de datos de un circuito a otro nuevo sin instrucciones.
from_circuit_data()Recrear a partir del objeto _data nativo de Rust.
from_instructions()Inferir los objetos de datos necesarios a partir de una lista de instrucciones.
from_qasm_file()Interfaz heredada para qasm2.load().
from_qasm_str()Interfaz heredada para qasm2.loads().

El constructor por defecto (QuantumCircuit(...)) produce un circuito sin instrucciones iniciales. Los argumentos del constructor por defecto se pueden utilizar para sembrar el circuito con almacenamiento de datos cuánticos y clásicos, y para proporcionar un nombre, fase global y metadatos arbitrarios. Todos estos campos pueden ampliarse posteriormente.

__init__

__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

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 especifica, se asignará una cadena generada automáticamente.

  • global_phase (ParameterExpression |float) – La fase global del circuito en radianes.

  • metadata (dict | None) – Metadatos con valores de clave arbitrarios para asociar al circuito. Esto se almacena como datos de formato libre en un diccionario dentro del atributo metadata . No se utilizará directamente en el circuito.

  • inputs (Iterable[Var]) – No hay variables que declarar como variables input de tiempo de ejecución para este circuito. Estos deberían ser nodos ya expr.Var existentes que hayas creado en otro lugar; si también necesitas crear las entradas, utiliza 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 heredar de un ámbito superior. 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 le dará al circuito copiado. Si es «None», el nombre se mantiene igual.

Devuelve

una copia profunda del circuito actual, con el nombre especificado

Tipo de retorno

QuantumCircuit

Del mismo modo, si quieres un circuito que contenga todos los mismos objetos de datos (bits, registros, variables, etc.), pero sin ninguna de las instrucciones, puedes utilizar copy_empty_like(). Esto es bastante habitual cuando se quiere crear una nueva capa de un circuito para luego aplicarla en la parte posterior con compose(), o para reescribir por completo las instrucciones de un circuito.

copy_empty_like

copy_empty_like(name=None, *, vars_mode='alike')

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 «None», el nombre se mantiene igual.

  • vars_mode (Literal['alike', 'captures', 'drop']) –

    El modo para manejar las variables en tiempo real.

    igual

    Las variables del circuito de salida tendrán la misma semántica de declaración que en el circuito original. Por ejemplo, las variables 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, al margen del contexto completo del circuito, y a continuación construir un circuito a partir de ella. El from_instructions() constructor capturará automáticamente todas Qubit las instancias de y Clbit utilizadas en las instrucciones y creará un nuevo QuantumCircuit objeto que cuente con los recursos adecuados y todas las instrucciones.

from_instructions

static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)

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 que hay que añadir al circuito.
  • qubits (Iterable[Qubit]) – Cualquier qubits para añadir al circuito. Este argumento puede utilizarse, por ejemplo, para imponer un orden determinado de los qubits.
  • clbits (Iterable[Clbit]) – Cualquier bit clásico para añadir al circuito. Este argumento puede utilizarse, por ejemplo, para imponer un orden determinado de los bits clásicos.
  • name (str | None) – El nombre del circuito.
  • global_phase (ParameterValueType) – La fase global del circuito en radianes.
  • metadata (dict | None) – Metadatos con valores de clave arbitrarios para asociar al circuito.

Devuelve

El circuito cuántico.

Tipo de retorno

QuantumCircuit

Si estás interactuando con código C o código nativo, es posible que necesites acceder a los datos internos subyacentes en QuantumCircuit._data. Puedes recrear el circuito completo utilizando from_circuit_data().

from_circuit_data

static from_circuit_data(data, /, *, name=None, metadata=None)

GitHub

Construye un circuito a partir de un objeto opaco CircuitData.

Normalmente, esta función se utiliza para envolver un objeto procedente de C en una clase QuantumCircuit completa de Python. El objeto CircuitData es el objeto nativo de Rust que se corresponde con el objeto de la API de C QkCircuit. Consulta su documentación para obtener más detalles sobre este objeto opaco.

La inversa de esta función es el atributo _data .

Parámetros

  • data (CircuitData) – el objeto nativo que contiene el circuito IR.
  • name (str | None) – : un nombre opcional, exclusivo de Python, que se aplicará al circuito.
  • metadata (dict | None) – : metadatos opcionales, arbitrarios y exclusivos de Python que se pueden adjuntar al circuito.

Devuelve

Un objeto de circuito completo.

Tipo de retorno

QuantumCircuit

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 |PathLike) – Ruta al archivo de un programa de 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 de OpenQASM2.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étodo
Añade este tipo de datos
add_bits()Qubits y Clbits.
add_register()QuantumRegister y ClassicalRegister.
add_var()Var nodos con ámbito local e inicializadores.
add_stretch()Stretch nodos de ámbito local.
add_input()Var nodos que se tratan como entradas del circuito.
add_capture()Var o Stretch nodos capturados de ámbitos contenedores.
add_uninitialized_var()Var nodos con ámbito local y estado indefinido.

Normalmente se añaden la mayoría de los objetos de datos (Qubit, Clbit, ClassicalRegisteretc) al circuito como parte del uso del constructor por defecto __init__() constructor por defecto, o copy_empty_like(). No obstante, también es posible añadirlas posteriormente. Los datos clásicos tipificados, como los nodos autónomos Var (véase Cálculo clásico en tiempo real ), pueden construirse y añadirse con métodos independientes.

Nuevo sin registro Qubit y Clbit se añaden mediante add_bits(). Estos objetos no deben estar ya presentes en el circuito. Puede comprobar si ya existe un bit en el circuito utilizando find_bit().

add_bits

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) – : o bien una cadena con el nombre de la variable, o bien una instancia existente de Var que se vaya a reutilizar. Las variables no pueden ocultar nombres que ya estén en uso dentro del circuito.

  • initial (Any) –

    el valor con el que inicializar esta variable. Si el primer argumento se ha dado como nombre de cadena, el tipo de la variable resultante se deduce de la expresión inicial; para controlar esto de forma más manual, utilice Var.new() para construir manualmente una nueva variable con el tipo deseado, o 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

  • name_or_var (str |Var) – : un nombre de cadena o un nodo Var existente que se 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.
  • type_ (Type | None)

Devuelve

la variable creada, o la misma variable que se pasó.

Eleva

CircuitError - si la variable no puede crearse debido a la sombra de una variable existente.

Tipo de retorno

Var

add_stretch

add_stretch(name_or_stretch)

GitHub

Declara un nuevo tramo para este circuito.

Parámetros

name_or_stretch (str |Stretch) – : o bien una cadena con el nombre del tramo, o bien una instancia ya existente que se vaya a Stretch reutilizar. Los nombres «Stretches» no pueden solaparse con nombres que ya estén en uso dentro del circuito.

Devuelve

El tramo creado. Si se ha dado una Stretch se devolverá exactamente el mismo objeto.

Eleva

CircuitError - si el tramo no puede crearse debido a la sombra de un identificador existente.

Tipo de retorno

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

Una Bit instancia es, en sí misma, simplemente un identificador único que los circuitos pueden utilizar en sus propios contextos. Si dispones de una Bit instancia y un circuito, puedes averiguar en qué contextos se encuentra el bit, find_bit() como su índice entero en el circuito y los registros en los que está contenido.

find_bit

find_bit(bit)

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, List[Tuple( Register, 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 habitual con Parameter las instancias consiste en sustituirlas, en operaciones simbólicas, por un valor numérico o por otra expresión simbólica. Esto se hace con assign_parameters().

assign_parameters

assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[False] = False, *, flat_input: bool = False, strict: bool = True) → QuantumCircuit

assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[True] = False, *, flat_input: bool = False, strict: bool = True) → None

GitHub

Asignar parámetros a nuevos parámetros o valores.

Si parameters se pasa como un diccionario, las claves deben ser Parameter instancias del circuito actual. Los valores del diccionario pueden ser valores numéricos o nuevos objetos de parámetro.

Si parameters se pasa como una lista o una matriz, los elementos se asignan a los parámetros actuales en el orden de parameters , que está ordenado alfabéticamente (respetando el orden de ParameterVector los objetos de ).

Los valores pueden asignarse al objeto circuito actual o a una copia del mismo.

Nota

Cuando parameters se define como una función de correspondencia, se permite que las claves sean cadenas que contengan los nombres de los parámetros; estas se buscarán utilizando get_parameter(). También puedes tener claves que sean ParameterVector instancias y, en ese caso, el valor del diccionario debe ser una secuencia de valores de la misma longitud que el vector.

flat_input=FalseSi utilizas cualquiera de estos casos, debes dejar la configuración tal cual; si la cambias, True se activará la ruta rápida, en la que todas las claves deben ser Parameter instancias.

Parámetros

  • parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – Un diccionario o un iterable que especifique los nuevos valores de los parámetros.
  • inplace (bool) – Si el valor es «False», se devuelve una copia del circuito con los parámetros vinculados. Si el valor es «True», se modifica la propia instancia del circuito.
  • flat_input (bool) – Si y True es parameters un tipo de aplicación, se supone que es exactamente una aplicación de {parameter: value}. Por defecto (False), la asignación también puede contener ParameterVector claves que apunten a una secuencia correspondiente de valores, las cuales se desarrollarán durante la asignación, o claves de cadena, que se convertirán en instancias Parameter mediante get_parameter().
  • strict (bool) – Si False, se ignorarán los parámetros especificados en la asignación que no se utilicen en el circuito. Si ( True valor predeterminado), se generará un error que indicará un error lógico.

Eleva

  • CircuitError - Si parameters es un dict y contiene parámetros no presentes en el circuito.
  • ValueError : si «parameters» es una lista o un array y su longitud no coincide con el número de parámetros libres del circuito.

Devuelve

Una copia del circuito con parámetros vinculados si inplace es False, en caso contrario None.

Tipo de retorno

QuantumCircuit | Ninguno

Ejemplos

Cree un circuito parametrizado y asigne los parámetros in situ.

from qiskit.circuit import QuantumCircuit, Parameter

circuit = QuantumCircuit(2)
params = [Parameter('A'), Parameter('B'), Parameter('C')]
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
circuit.draw('mpl')
circuit.assign_parameters({params[0]: params[2]}, inplace=True)
circuit.draw('mpl')
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 realiza el seguimiento de los parámetros a través de Parameter las propias instancias y no permite que haya varios parámetros con el mismo nombre, con el fin de evitar ciertos problemas a la hora de interoperar con OpenQASM u otros formatos externos. Puedes utilizar has_parameter() y get_parameter() para consultar el circuito en busca de un parámetro con el nombre de cadena indicado.

has_parameter

has_parameter(name_or_param, /)

GitHub

Comprueba si existe un objeto parámetro en este circuito.

Parámetros

name_or_param (str |Parameter) – : el parámetro o el nombre del parámetro que se va a comprobar. Si se trata de un nodo Parameter , el parámetro debe ser exactamente el indicado para que esta función devuelva True.

Devuelve

si un parámetro de coincidencia es asignable en este circuito.

Tipo de retorno

bool

Consulte también

QuantumCircuit.get_parameter()

Recupera la Parameter instancia de este circuito por su nombre.

QuantumCircuit.has_var()

ParameterUn método similar a este, pero para variables de tiempo expr.Var de ejecución en lugar de variables de tiempo de compilación.

get_parameter

get_parameter(name: str, default: T) → Parameter | T

get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter

GitHub

Recupera un parámetro en tiempo de compilación accesible en este ámbito de circuito por su nombre.

Parámetros

  • name (str) – : el nombre del parámetro que se va a recuperar.
  • default (Any) – : si se proporciona, se devolverá este valor en caso de que el parámetro no esté presente. Si no se especifica, KeyError se genera un en su lugar.

Devuelve

El parámetro correspondiente.

Eleva

KeyError : si no se ha especificado ningún valor por defecto, pero el parámetro no existe en el circuito.

Tipo de retorno

Parámetro

Ejemplos

Recuperar un parámetro de un circuito por su nombre:

from qiskit.circuit import QuantumCircuit, Parameter

my_param = Parameter("my_param")

# Create a parametrized circuit.
qc = QuantumCircuit(1)
qc.rx(my_param, 0)

# We can use 'my_param' as a parameter, but let's say we've lost the Python object
# and need to retrieve it.
my_param_again = qc.get_parameter("my_param")

assert my_param == my_param_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) == 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 de tiempo de ejecución en lugar de Parameter parámetros de tiempo de compilación.

Trabajar con datos clásicos escritos 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: builtin_types.EllipsisType = Ellipsis) → Var

GitHub

Recupera una variable accesible en este ámbito de circuito por su nombre.

Parámetros

  • name (str) – : el nombre de la variable que se va a recuperar.
  • default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica, KeyError se genera un en su lugar.

Devuelve

La variable correspondiente.

Eleva

KeyError : si no se ha especificado ningún valor por defecto, pero la variable no existe.

Ejemplos

Recuperar una variable por su nombre de un circuito:

from qiskit.circuit import QuantumCircuit

# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_var = qc.add_var("my_var", False)

# We can use 'my_var' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_var_again = qc.get_var("my_var")

assert my_var == my_var_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) == 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 de tiempo de compilación en lugar de expr.Var variables de tiempo de ejecución.

get_stretch

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

get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch

GitHub

Recupera un tramo accesible en este ámbito de circuito por su nombre.

Parámetros

  • name (str) – : el nombre del tramo que se desea recuperar.
  • default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica, KeyError se genera un en su lugar.

Devuelve

El tramo correspondiente.

Eleva

KeyError : si no se ha especificado ningún valor por defecto, pero la variable no existe.

Ejemplos

Recuperar un tramo por su nombre de un circuito:

from qiskit.circuit import QuantumCircuit

# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_stretch = qc.add_stretch("my_stretch")

# We can use 'my_stretch' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_stretch_again = qc.get_stretch("my_stretch")

assert my_stretch == my_stretch_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) == 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: builtin_types.EllipsisType = 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 (str) – : el nombre del identificador que se desea recuperar.
  • default (Any) – : si se proporciona, se devolverá este valor si la variable no existe. Si no se especifica, KeyError se genera un en su lugar.

Devuelve

La variable correspondiente.

Eleva

KeyError : si no se ha especificado ningún valor por defecto, pero el identificador no existe.

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 de tiempo de compilación en lugar de expr.Var variables de 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 la variable que se va a comprobar. Si se trata de un expr.Var nodo, la variable debe ser exactamente la indicada para que esta función devuelva True.

Devuelve

si una variable coincidente es accesible.

Tipo de retorno

bool

Consulte también

QuantumCircuit.get_var()

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

QuantumCircuit.has_parameter()

ParameterUn método similar a este, pero para variables de tiempo de compilación en lugar de variables de tiempo expr.Var de ejecución.

has_stretch

has_stretch(name_or_stretch, /)

GitHub

Comprueba si un tramo es accesible en este ámbito.

Parámetros

name_or_stretch (str |Stretch) – el tramo, o el nombre del tramo que se va a comprobar. Si se trata de un nodo expr.Stretch , el estiramiento debe ser exactamente el indicado para que esta función devuelva True.

Devuelve

si un tramo coincidente es accesible.

Tipo de retorno

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 expr.Stretch nodo o expr.Var , la instancia coincidente debe ser exactamente la indicada para que esta función devuelva True.

Devuelve

si un identificador coincidente es accesible.

Tipo de retorno

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

ParameterUn método similar a este, pero para variables de tiempo de compilación en lugar de variables de tiempo expr.Var de ejecución.

También hay varios métodos iteradores que puedes utilizar para obtener el conjunto completo de identificadores rastreados por un circuito. Al menos uno de iter_input_vars() y iter_captured_vars() estará vacío, ya que las entradas y las capturas se excluyen mutuamente. Todos los iteradores tienen sus correspondientes propiedades dinámicas en QuantumCircuit que contienen su longitud: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_varso num_declared_stretches.

iter_vars

iter_vars()

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

Puedes añadir cualquier elemento que implemente la Operation interfaz a un circuito mediante una sola instrucción, aunque la mayoría de los elementos que querrás añadir serán instancias de Instruction o Gate .

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étodo
Cuándo utilizarlo
append()Añade una instrucción como objeto individual a un circuito.
_append()Igual que append()pero con una interfaz de bajo nivel que elude casi toda comprobación de errores.
compose()Inserta las instrucciones de un circuito en otro.
tensor()Como compose()pero estrictamente para unir circuitos que actúan sobre qubits disjuntos.

QuantumCircuit tiene dos formas principales de añadir más operaciones a un circuito. La elección depende de si desea añadir el objeto como una única "instrucción" (append()), o si desea unir las instrucciones de dos circuitos (compose()).

Una instrucción u operación aparece como una sola entrada en el data del circuito y como un único recuadro cuando se dibuja en los visualizadores de circuitos (véase draw()). Una instrucción es la «unidad» en función de la cual se puede definir un backend de hardware (véase Target). Un Instruction puede ir acompañado de un definition, que es una regla a la que el transpilador (véase qiskit.transpiler) podrá recurrir para descomponerlo para el hardware, si fuera necesario. Un Operation que no sea también un Instruction solo puede descomponerse si tiene registrado algún método de síntesis de alto nivel asociado (véase qiskit.transpiler.passes.synthesis.plugin).

Una QuantumCircuit por sí sola no es un simple Instruction; es más bien algo más complejo, ya que, en general, puede representar un programa completo con entradas y salidas de memoria clásicas tipadas, así como flujo de control. El modelo de datos de Qiskit (y del mayor parte del hardware) aún no incluye el concepto de subrutinas reutilizables y ejecutables con operandos cuánticos virtuales. Se pueden convertir circuitos simples que actúan únicamente sobre qubits mediante operaciones unitarias en un Gate utilizando to_gate(), y circuitos simples que actúan únicamente sobre qubits y clbits en un Instruction utilizando to_instruction().

Cuando tengas un Operation, Instruction, o Gate, añádelo al circuito, especificando los argumentos «qubit» y «clbit» con append().

append

append(instruction, qargs=None, cargs=None, *, copy=True)

GitHub

Añadir una o más instrucciones al final del circuito, modificando el circuito en su lugar.

InstructionLos elementos qargs y cargs se ampliarán y se transmitirán de acuerdo con las reglas del dado, y cualquier elemento que no seaBit un especificador (como los índices enteros) se resolverá en las instancias pertinentes.

Si se proporciona un CircuitInstruction , se descomprimirá, se verificará en el contexto de este circuito y se añadirá un nuevo objeto al circuito. En este caso, no puedes pasar qargs ni cargs por separado.

Parámetros

  • instruction (Operation |CircuitInstruction) –Instruction instancia a la que añadir, o un CircuitInstruction con todo su contexto. También se admiten los objetos que implementan to_instruction , pero por lo general es preferible pasar un Instruction directamente, ya que así se evita el coste de las conversiones repetidas.
  • Especificadores qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – de los Qubit«s» a los que se va a adjuntar la instrucción.
  • Especificadores cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – de los Clbit«s» a los que se va a adjuntar la instrucción.
  • copy (bool) – si ( True por defecto), entonces el valor entrante instruction se copia antes de añadirlo al circuito si contiene parámetros simbólicos, de modo que pueda modificarse con seguridad sin afectar a otros circuitos en los que pueda encontrarse la misma instrucción. Si estás seguro de que esta instrucción no aparecerá en otros circuitos, puedes configurarla así para False obtener una pequeña mejora en la velocidad.

Devuelve

una referencia a los CircuitInstruction«s» que se añadieron realmente al circuito.

Tipo de retorno

qiskit.circuit.InstructionSet

Eleva

CircuitError – si la operación pasada no es una instancia de Instruction, o no puede convertirse en una llamando a to_instruction sobre ella.

append() realiza una comprobación de errores bastante importante para garantizar que no se rompa accidentalmente el modelo de datos de QuantumCircuit. Si estás generando programáticamente un circuito a partir de datos conocidos, puedes eludir gran parte de esta comprobación de errores utilizando el fast-path appender _append()pero a riesgo de que el que llama sea responsable de asegurarse de que está pasando sólo datos válidos.

_append

_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction

_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation

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 -

    Se debe añadir una descripción completa y bien estructurada CircuitInstruction de la operación y su contexto.

    En el formulario de compatibilidad con versiones anteriores, puede tratarse de un Operation, en cuyo caso qargs y cargs deben indicarse explícitamente.

  • qargs – Argumento heredado para que los qubits se acoplen al «bare Operation ». Se ignora si el primer argumento está en forma preferencial CircuitInstruction .

  • cargs : argumento heredado de clbits al que se adjunta el «bare Operation ». Se ignora si el primer argumento está en forma preferencial CircuitInstruction .

  • _standard_gate (bool)

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.

compose

compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[True] = True, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → None

compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[False] = False, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → QuantumCircuit

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 componerse a sí mismo. Si no es un QuantumCircuit, puede ser cualquier cosa que append acepte.

  • qubits (list[Qubit|int]) – qubits propios sobre los que componer.

  • clbits (list[Clbit|int]) – clbits de «self» sobre los que realizar la composición.

  • front (bool) – Si True, se realizará la composición frontal. Esto no es posible dentro de los gestores de contexto del generador de flujo de control.

  • inplace (bool) – Si es así True, modifica el objeto. De lo contrario, devuelve el circuito compuesto.

  • copy (bool) – Si ( True valor por defecto), la entrada se considera compartida y se copiarán todas las instrucciones que contenga, en caso de que sea necesario modificarlas en el futuro. Puedes configurar esta opción para indicar que False la entrada debe considerarse propiedad del circuito base, con el fin de evitar copias innecesarias; en este caso, no es válido utilizar other posteriormente, y es posible que algunas instrucciones se hayan modificado in situ.

  • 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 verdadero, envuelve el otro circuito en una puerta (o instrucción, dependiendo de si contiene únicamente instrucciones unitarias) antes de componerlo sobre sí mismo. En lugar de utilizar esta opción, casi siempre es mejor controlarlo manualmente tú mismo utilizando o to_instruction() to_gate(), y después llamar 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 es así True, modifica el objeto. De lo contrario, devuelve el circuito compuesto.

Tipo de retorno

QuantumCircuit | Ninguno

Ejemplos

from qiskit import QuantumCircuit
top = QuantumCircuit(1)
top.x(0);
bottom = QuantumCircuit(2)
bottom.cry(0.2, 0, 1);
tensored = bottom.tensor(top)
tensored.draw('mpl')
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:

  • Aunque reutilices una función personalizada Instruction durante la construcción del circuito, el transpilador, por lo general, tendrá que «desenrollar» cada invocación de la misma hasta su descomposición interna antes de empezar a trabajar en ella. to_instruction()Esto no debería impedirte utilizar el patrón «-plus-»append() , ya que el transpilador irá mejorando en este aspecto con el tiempo.
  • compose() producirá, por defecto, un nuevo circuito por compatibilidad con versiones anteriores. Esto es más caro, y no suele ser lo que quieres, por lo que deberías poner inplace=True.
  • Tanto append() como compose() (pero no _append()) tienen un copy argumento de palabra clave cuyo valor por defecto es True. En estos casos, las instancias entrantes Operation se copiarán si Qiskit detecta que los objetos son mutables (por ejemplo, al tomar los parámetros de las puertas). Si estás seguro de que no volverás a utilizar los objetos en otros lugares, deberías configurar copy=False para evitar esta copia, lo que puede suponer una mejora considerable de la velocidad en el caso de objetos de gran tamaño.

Métodos para añadir instrucciones estándar

La QuantumCircuit clase dispone de métodos auxiliares para añadir muchas de las instrucciones y puertas de la biblioteca estándar de Qiskit a un circuito. Esto equivale, en general, a crear manualmente una instancia del objeto qiskit.circuit.library correspondiente y, a continuación, pasarla a append() con los argumentos restantes colocados en los campos qargs cargs y según corresponda.

Los siguientes métodos aplican operaciones especiales no unitarias Instruction al circuito:

Estos métodos aplican instancias unitarias Gate no controladas al circuito:

Los siguientes métodos se aplican a Gate instancias que también son puertas controladas, por lo que son subclases directas de ControlledGate:

Por último, estos métodos aplican al circuito determinadas puertas generalizadas de control múltiple, a menudo con síntesis ávidas. Se enumeran en función de la puerta base que controlan, ya que su salida exacta suele ser una versión sintetizada de una puerta.

El resto de esta sección es el listado API de todos los métodos individuales; las tablas anteriores son resúmenes cuyos enlaces le llevarán al lugar correcto.

barrier

barrier(*qargs, label=None)

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, label=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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

cry

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como control.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como controles.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

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

  • control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El(los) qubit(s) utilizado(s) como controles.
  • target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – El qubit o los qubits a los que se dirige la puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.
  • ctrl_state (str |int | None) – El estado de control en formato decimal o como cadena de bits (p. ej., «1»). Por defecto, el control se activa en el estado «1».

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

dcx

dcx(qubit1, qubit2, label=None)

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

delay

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 duración, a menos que duration sea un, en Expr cuyo caso no debe especificarse. Unidades compatibles: 's', 'ms', 'us', 'ns', 'ps', y 'dt'. El valor por defecto es 'dt', es decir, una unidad de tiempo entera que depende del backend de destino.

Devuelve

asa a las instrucciones añadidas.

Tipo de retorno

qiskit.circuit.InstructionSet

Eleva

CircuitError - si los argumentos tienen mal formato.

ecr

ecr(qubit1, qubit2, label=None)

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, label=None)

GitHub

Solicitar HGate.

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

id

id(qubit, label=None)

GitHub

Solicitar IGate.

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

initialize

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

GitHub

Inicializar qubits en un estado específico.

La inicialización de los qubits se realiza restableciéndolos primero a un estado de « ∣0⟩|0\rangle » y, a continuación, llamando StatePreparation a la clase para prepararlos en un estado específico. Ambos pasos figuran en las Initialize instrucciones.

Parámetros

  • params (Statevector | Sequence[complex] | str |int) –

    El estado a inicializar puede ser cualquiera de los siguientes.

    • Vector de estado o vector de amplitudes complejas para inicializar.
    • Etiquetas de los estados base de los estados propios de Pauli Z, X e Y. Consulte Statevector.from_label(). Fíjate en que el orden de las etiquetas es inverso al del índice del qubit al que se va a aplicar. La etiqueta '01' «Example» inicializa el qubit cero como ∣1⟩|1\rangle y el qubit uno como ∣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) – Indica si se debe normalizar una matriz de entrada a un vector unitario.

Devuelve

Un handle a las instrucciones creadas.

Ejemplos

Prepara un qubit en el estado (∣0⟩−∣1⟩)/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) ├
     └──────────────────────────────┘

Inicializa, a partir de una cadena de caracteres, dos qubits en el estado ∣10⟩|10\rangle. El orden de las etiquetas se invierte con respecto al índice de los qubits. Encontrarás más información sobre las etiquetas de los estados básicos en Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()

Salida:

     ┌──────────────────┐
q_0: ┤0                 ├
     │  Initialize(0,1) │
q_1: ┤1                 ├
     └──────────────────┘

Inicializar dos qubits a partir de una matriz de amplitudes complejas.

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.initialize([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()

Salida:

     ┌────────────────────────────────────┐
q_0: ┤0                                   ├
     │  Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1                                   ├
     └────────────────────────────────────┘

iswap

iswap(qubit1, qubit2, label=None)

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, label=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, label=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 se desconoce el modo indicado o si se han pasado muy pocos qubits auxiliares.
  • AttributeError : si no se pasan qubits auxiliares, pero se necesitan algunos.

Tipo de retorno

InstructionSet

measure

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, label=None)

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, label=None)

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, label=None)

GitHub

Solicitar PauliGate.

Parámetros

  • pauli_string (str) – Una cadena que representa el operador de Pauli que se va a aplicar, p. ej., «XX».
  • qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Los qubits a los que se aplicará esta puerta.
  • label (str | None) – La etiqueta de cadena de la puerta del circuito.

Devuelve

Un handle a las instrucciones creadas.

Tipo de retorno

InstructionSet

prepare_state

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 e Y. Consulte Statevector.from_label(). Fíjate en que el orden de las etiquetas es inverso al del índice del qubit al que se va a aplicar. La etiqueta de ejemplo «01» inicializa el qubit cero como ∣1⟩|1\rangle y el qubit uno como ∣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 compuerta

  • normalize (bool) – Indica si se debe normalizar una matriz de entrada a un vector unitario.

Devuelve

Un "handle" de la instrucción que se acaba de inicializar

Tipo de retorno

InstructionSet

Ejemplos

Prepara un qubit en el estado (∣0⟩−∣1⟩)/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) ├
     └─────────────────────────────────────┘

Prepara, a partir de una cadena, dos qubits en el estado ∣10⟩|10\rangle. El orden de las etiquetas es inverso al del índice de los qubits. Encontrarás más información sobre las etiquetas de los estados básicos en Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()

Salida:

     ┌─────────────────────────┐
q_0: ┤0                        ├
     │  State Preparation(0,1) │
q_1: ┤1                        ├
     └─────────────────────────┘

Inicializar dos qubits a partir de una matriz de amplitudes complejas

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.prepare_state([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()

Salida:

     ┌───────────────────────────────────────────┐
q_0: ┤0                                          ├
     │  State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1                                          ├
     └───────────────────────────────────────────┘

r

r(theta, phi, qubit, label=None)

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, label=None)

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, label=None)

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

reset

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) que se deben restablecer.

Devuelve

a la instrucción añadida.

Tipo de retorno

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit, label=None)

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, label=None)

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, label=None)

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, label=None)

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, label=None)

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, label=None)

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, label=None)

GitHub

Solicitar SGate.

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

sdg

sdg(qubit, label=None)

GitHub

Solicitar SdgGate.

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

store

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 de soporte 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.

swap

swap(qubit1, qubit2, label=None)

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, label=None)

GitHub

Solicitar SXGate.

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

sxdg

sxdg(qubit, label=None)

GitHub

Solicitar SXdgGate.

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

t

t(qubit, label=None)

GitHub

Solicitar TGate.

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

tdg

tdg(qubit, label=None)

GitHub

Solicitar TdgGate.

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

u

u(theta, phi, lam, qubit, label=None)

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

unitary

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 [Default: None].

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, label=None)

GitHub

Solicitar YGate.

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

z

z(qubit, label=None)

GitHub

Solicitar ZGate.

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

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 cuenta con los métodos correspondientes para todas las operaciones de flujo de control que admite Qiskit. Hay dos formas de llamarlas. ControlFlowOpLa primera es una envoltura de conveniencia muy sencilla que toma como QuantumCircuit argumentos los cuerpos de los bloques de las instrucciones y, simplemente, construye y añade el correspondiente.

La segunda forma, que te recomendamos encarecidamente que utilices para construir el flujo de control, se denomina «interfaz de constructor ». En este caso, los métodos solo toman el discriminante en tiempo real de la operación y devuelven gestores de contexto que se introducen mediante with. A continuación, puedes utilizar métodos normales QuantumCircuit dentro de esos bloques para construir los cuerpos del flujo de control, y Qiskit hará un seguimiento automático de cuáles son los recursos de datos necesarios para los bloques internos, construyendo el conjunto completo ControlFlowOp a medida que sales de la with instrucción. Es mucho más sencillo y menos propenso a errores crear el flujo de control mediante programación de esta manera.

Al utilizar la interfaz del constructor de flujo de control, puede que a veces quieras que un qubit se incluya en un bloque, aunque no tenga operaciones definidas. En este caso, puede utilizar el método noop() método.

QuantumCircuit.has_control_flow_op()Para comprobar si un circuito contiene un ControlFlowOp , puedes utilizar el método auxiliar.

box

box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)

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:

  • Pasa un QuantumCircuit por referencia, así como el qubits y clbits el sobre los que actúa. En este formulario, se crea inmediatamente un BoxOp y se añade utilizando el circuito como contenido.
  • 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 se pasa un QuantumCircuit como parámetro posicional, se utiliza inmediatamente como cuerpo del recuadro, y qubits también deben especificarse y clbits . Si no se especifica, o si se especifica un iterable de Annotation objetos, se activa la versión de este método correspondiente al gestor de contexto.
  • qubits (Sequence[QubitSpecifier] | None) – los qubits a los que se aplica la BoxOp operación, en su forma explícita.
  • clbits (Sequence[ClbitSpecifier] | None) – los clbits a los BoxOp que se debe aplicar el, en forma explícita.
  • label (str | None) – : una etiqueta de cadena opcional para la instrucción.
  • duration (None) – una duración explícita opcional para el BoxOp. Los pases de programación tienen la restricción de programar el ámbito que contienen para que se ajuste a una duración determinada, incluyendo la inserción de retrasos si es necesario.
  • unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – la unidad de la duration.
  • annotations (Iterable[Annotation]) – cualquier Annotation objeto que deba contener la caja. Cuando este método se utiliza en forma de gestor de contexto, este argumento puede pasarse, en su lugar, como único argumento posicional.

break_loop

break_loop()

GitHub

Solicitar BreakLoopOp.

Aviso

Si utilizas las formas «builder» del gestor de contexto de if_test(), for_loop() o while_loop(), solo podrás llamar a este método si te encuentras dentro de un contexto de bucle, ya que, de lo contrario, no se puede determinar el «ancho del recurso» de la operación. Esto provocaría rápidamente circuitos inválidos, por lo que, si intentas crear un cuerpo de bucle reutilizable (sin los gestores de contexto), también debes utilizar la forma sin gestor de contexto de if_test() y if_else(). Ten en cuenta que la BreakLoopOp instrucción debe abarcar todos los recursos del bucle que la contiene, no solo el ámbito inmediato.

Devuelve

Un handle de la instrucción creada.

Eleva

CircuitError - si este método fue llamado dentro de un contexto constructor, pero no contenido dentro de un bucle.

Tipo de retorno

InstructionSet

continue_loop

continue_loop()

GitHub

Solicitar ContinueLoopOp.

Aviso

Si utilizas las formas «builder» del gestor de contexto de if_test(), for_loop() o while_loop(), solo podrás llamar a este método si te encuentras dentro de un contexto de bucle, ya que, de lo contrario, no se puede determinar el «ancho del recurso» de la operación. Esto provocaría rápidamente circuitos inválidos, por lo que, si intentas crear un cuerpo de bucle reutilizable (sin los gestores de contexto), también debes utilizar la forma sin gestor de contexto de if_test() y if_else(). Ten en cuenta que la ContinueLoopOp instrucción debe abarcar todos los recursos del bucle que la contiene, no solo el ámbito inmediato.

Devuelve

Un handle de la instrucción creada.

Eleva

CircuitError - si este método fue llamado dentro de un contexto constructor, pero no contenido dentro de un bucle.

Tipo de retorno

InstructionSet

for_loop

for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None = None, body: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → ForLoopContext

for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet

GitHub

Crea un bucle for en este circuito.

Hay dos formas de llamar a esta función. bodySi se invoca con todos sus argumentos (con la posible excepción de label), creará un ForLoopOp con el dado. Si body no se pasan (ni qubits ni clbits), entonces esto actúa como un gestor de contexto que, al iniciarse, proporciona una variable de bucle (a menos que se especifique una, en cuyo caso se reutilizará) y creará automáticamente un ForLoopOp al finalizar el ámbito. En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.

Por ejemplo:

from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 1)

with qc.for_loop(range(5)) as i:
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)
    with qc.if_test((0, True)):
        qc.break_loop()

Parámetros

  • indexset (Iterable[int]) – Una colección de números enteros sobre la que se va a recorrer. Siempre es necesario.

  • loop_parameter (Optional[Parameter|expr.Var]) –

    El parámetro utilizado en 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, bien un gestor de contexto para crear el bucle «for» (que se añadirá automáticamente al circuito al final del bloque), bien un InstructionSet identificador de la operación de bucle añadida.

Tipo de retorno

InstructionSet o ForLoopContext

Eleva

CircuitError - si se utiliza una convención de llamada incorrecta.

if_else

if_else(condition, true_body, false_body, qubits, clbits, label=None)

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[ClassicalRegister | Clbit, int] | Expr) → IfContext

if_test(condition: tuple[ClassicalRegister | Clbit, int] | Expr, true_body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet

GitHub

Cree una declaración if en este circuito.

Hay dos formas de llamar a esta función. true_bodySi se invoca con todos sus argumentos (con la posible excepción de label), creará un IfElseOp con el dado, y no habrá ninguna ramificación para la false condición (véase también el if_else() método ). Sin embargo, si true_body no se pasan (y qubits y clbits), entonces actúa como un gestor de contexto, que puede utilizarse para construir if sentencias. El valor de retorno de la with instrucción es un gestor de contexto encadenable, que puede utilizarse para crear bloques posteriores else . En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.

Por ejemplo:

from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Qubit(), Clbit(), Clbit()]
qc = QuantumCircuit(bits)

qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 1)

with qc.if_test((bits[3], 0)) as else_:
    qc.x(2)
with else_:
    qc.h(2)
    qc.z(2)

Parámetros

  • condition (expr.Expr | Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición que se evalúa en tiempo real durante la ejecución del circuito y que, si es verdadera, activará la evaluación de true_body. O bien un Expr de tipo Bool() , o bien la forma tradicional de igualdad de dos tuplas (register_or_bit, value).
  • true_body (Optional[QuantumCircuit]) – El cuerpo del circuito que se ejecutará si 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 sintaxis de la llamada, bien un gestor de contexto para crear el if bloque (que se añadirá automáticamente al circuito al final del bloque), bien un InstructionSet identificador de la operación condicional añadida.

Tipo de retorno

InstructionSet o IfContext

Eleva

  • CircuitError - Si la condición proporcionada hace referencia a Clbits fuera del circuito envolvente.
  • CircuitError - si se utiliza una convención de llamada incorrecta.

Devuelve

Un handle de la instrucción creada.

switch

switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Expr, cases: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → SwitchContext

switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Expr, cases: Iterable[tuple[Any, QuantumCircuit]], qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet

GitHub

Cree una estructura switch/case en este circuito.

Hay dos formas de llamar a esta función. Si se invoca con todos sus argumentos (con la posible excepción de label), creará un SwitchCaseOp con la estructura de caso indicada. Si cases no se pasan (ni qubits ni clbits), entonces esto actúa como un gestor de contexto, que creará automáticamente un SwitchCaseOp cuando finalice el ámbito. En este formato, no es necesario que lleves un control de los qubits o clbits que estás utilizando, ya que el ámbito se encargará de ello por ti.

Ejemplo de uso:

from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
qc.h([0, 1, 2])
qc.measure([0, 1, 2], [0, 1, 2])

with qc.switch(creg) as case:
    with case(0):
        qc.x(0)
    with case(1, 2):
        qc.z(1)
    with case(case.DEFAULT):
        qc.cx(0, 1)

Parámetros

  • target (expr.Expr | Union[ClassicalRegister, Clbit]) – El valor clásico para encenderlo. O bien un Expr de tipo Bool() o Uint(n) , o bien un o ClassicalRegister Clbit.
  • 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[ClassicalRegister | Clbit, int] | Expr, body: None = None, qubits: None = None, clbits: None = None, *, label: str | None = None) → WhileLoopContext

while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet

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 (expr.Expr | Tuple[Union[ClassicalRegister, Clbit], int]) – Una condición que hay que comprobar antes de ejecutar body. O bien un Expr de tipo Bool() , o bien la forma tradicional de igualdad de dos tuplas (register_or_bit, value).
  • body (Optional[QuantumCircuit]) – El cuerpo del bucle que se ejecutará repetidamente. Omítalo para utilizar el modo de gestor de contexto.
  • qubits (Optional[Sequence[Qubit]]) – Los qubits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
  • clbits (Optional[Sequence[Clbit]]) – Los clbits del circuito sobre los que debe ejecutarse el cuerpo del bucle. Omítalo para utilizar el modo de gestor de contexto.
  • label (Optional[str]) – La etiqueta de cadena de la instrucción en el circuito.

Devuelve

Si se utiliza en modo gestor de contexto, debe utilizarse como recurso with , que inferirá el contenido del bloque y los operandos al salir. Si se utiliza la forma completa, devuelve un manejador a las instrucciones creadas.

Tipo de retorno

InstructionSet o WhileLoopContext

Eleva

CircuitError - si se utiliza una convención de llamada incorrecta.

noop

noop(*qargs)

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 pueda pasarse como un qubit o un conjunto de qubits es válida para cada argumento de esta función.

Eleva

CircuitError - si algún qubit solicitado no es válido para el circuito.

has_control_flow_op

has_control_flow_op()

GitHub

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

Tipo de retorno

bool

Conversión de circuitos a otros objetos

Tal y como se explica en «Métodos para añadir operaciones generales », puedes convertir un circuito en un Instruction o en un Gate utilizando dos métodos auxiliares.

to_instruction

to_instruction(parameter_map=None, label=None)

GitHub

Crea un Instruction a partir de este circuito.

Consulte también

circuit_to_instruction()

El motor subyacente de este método.

Parámetros

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – En el caso de los circuitos parametrizados, una correspondencia entre los parámetros del circuito y los parámetros que se utilizarán en la instrucción. Si el valor es «None», los parámetros del circuito existentes también se aplicarán a la instrucción.
  • label (str | None) – Etiqueta opcional de la puerta.

Devuelve

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

espalda descompuesta).

Tipo de retorno

qiskit.circuit.Instruction

to_gate

to_gate(parameter_map=None, label=None)

GitHub

Crea un Gate a partir de este circuito. El circuito debe actuar únicamente sobre qubits y contener únicamente operaciones unitarias.

Consulte también

circuit_to_gate()

El motor subyacente de este método.

Parámetros

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – En el caso de los circuitos parametrizados, una correspondencia entre los parámetros del circuito y los parámetros que se utilizarán en la puerta lógica. En ese caso None, los parámetros del circuito existente también determinarán los parámetros de la puerta.
  • label (str | None) – Etiqueta opcional de la puerta.

Devuelve

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

Tipo de retorno

Puerta

Además, puedes convertir todo el circuito a la DAGCircuit representación:

to_dag

to_dag(*, copy_operations=True)

GitHub

Convierte este circuito en un DAGCircuit.

Se trata de un sencillo envoltorio alrededor de circuit_to_dag().

Parámetros

copy_operations (bool) – si se debe realizar una copia profunda de las instrucciones individuales. Si se configura en False, la operación es más económica, pero las modificaciones en las instrucciones del DAG afectarán al circuito original.

Devuelve

un DAG que representa este mismo circuito.

Tipo de retorno

qiskit.dagcircuit.DAGCircuit

Métodos de mutación auxiliar

Existen dos métodos superiores en QuantumCircuit para añadir medidas al final de un circuito. Tenga en cuenta que, por defecto, también añaden un registro adicional.

measure_active

measure_active(inplace=True)

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 se realizan in situ o se devuelve un 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 se realizan in situ o se devuelve un nuevo circuito.
  • add_bits (bool) – Si se deben añadir nuevos bits para almacenar los resultados.

Devuelve

Devuelve el circuito con las medidas cuando inplace=False.

Tipo de retorno

QuantumCircuit

Eleva

CircuitError - si add_bits=False pero no hay suficientes bits clásicos.

También hay dos métodos «sustractivos» en QuantumCircuit . RemoveFinalMeasurementsEste no es un caso de uso para el que QuantumCircuit esté diseñado; normalmente, lo mejor es utilizar copy_empty_like() en lugar de clear(), y ejecutar remove_final_measurements() como su forma de paso del transpilador.

clear

clear()

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

remove_final_measurements

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 se eliminan in situ o se devuelve un nuevo circuito.

Devuelve

Devuelve el circuito resultante si inplace=False, si no Ninguno.

Tipo de retorno

QuantumCircuit


Propiedades del circuito

Métricas de circuitos simples

Al construir circuitos cuánticos, hay varias propiedades que ayudan a cuantificar el "tamaño" de los circuitos y su capacidad para ejecutarse en un dispositivo cuántico ruidoso. Algunos de ellos, como el número de qubits, son fáciles de entender, mientras que otros, como la profundidad y el número de componentes del tensor, requieren algo más de explicación. Aquí explicaremos todas estas propiedades y, como preparación para comprender cómo cambian los circuitos cuando se ejecutan en dispositivos reales, destacaremos las condiciones en las que cambian.

Considera el siguiente circuito:

from qiskit import QuantumCircuit
qc = QuantumCircuit(12)
for idx in range(5):
   qc.h(idx)
   qc.cx(idx, idx+5)

qc.cx(1, 7)
qc.x(8)
qc.cx(1, 9)
qc.x(7)
qc.cx(1, 11)
qc.swap(6, 11)
qc.swap(6, 9)
qc.swap(6, 10)
qc.x(6)
qc.draw('mpl')
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 del número de operaciones de cada tipo, ordenadas por importe.

Tipo de retorno

OrderedDict [ str, int ]

depth

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 determinar qué instrucciones se tienen en cuenta a la hora de aumentar la profundidad. Debe aceptar como única entrada posicional un CircuitInstruction. Las instrucciones para las que la función devuelve un valor False se ignoran en el cálculo de la profundidad del circuito. De forma predeterminada, excluye las «directivas», como Barrier.

Devuelve

Profundidad del circuito.

Tipo de retorno

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

get_instructions

get_instructions(name)

GitHub

Obtener instrucciones que coincidan con el nombre.

Parámetros

name (str) – El nombre de la instrucción que se desea obtener.

Devuelve

lista de (instrucción, qargs, cargs).

Tipo de retorno

lista ( tupla )

num_connected_components

num_connected_components(unitary_only=False)

GitHub

¿En cuántos subcircuitos no enredados se puede factorizar el circuito?

Parámetros

unitary_only (bool) – Calcular únicamente la parte unitaria del grafo.

Devuelve

Número de componentes conectados en el circuito.

Tipo de retorno

int

num_nonlocal_gates

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

size

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

width

width()

GitHub

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

Devuelve

Anchura del circuito.

Tipo de retorno

int

Acceso a la información sobre horarios

Si un QuantumCircuit se ha programado como parte de un canal de transpilación, se puede acceder a la información de temporización de qubits individuales. La información de temporización de todo el circuito está disponible a través del estimate_duration() método y op_start_times atributo.

estimate_duration

estimate_duration(target, unit='s')

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) – Si el objetivo carece de datos de duración para cualquiera de las instrucciones del circuito, QiskitError se generará una excepción en Target la instancia que contiene las duraciones de las instrucciones. Este debería ser el mismo objeto de destino que se utiliza como destino para la transpilación.
  • unit (str) – La unidad en la que se devolverá la duración. El valor por defecto es «s» (segundos), pero puede ser cualquier prefijo del Sistema Internacional (SI) compatible con los resultados en segundos. Por ejemplo, si se establece este valor en «n», los resultados se mostrarán en nanosegundos. Los valores admitidos para este tipo son «f», «p», «n», «u», «µ», «m», «k», «M», «G», «T» y «P». Además, también se acepta el valor «dt» para generar un número entero en unidades de «dt». Para que esto funcione, hay que especificar «dt» en el archivo target.

Devuelve

La duración estimada para la ejecución de un solo disparo del circuito en la unidad especificada.

Eleva

QiskitError - Si el circuito no está programado o contiene otros detalles que impiden calcular una duración estimada a partir de (como el retardo parametrizado).

Tipo de retorno

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 que self se deben incluir.

Devuelve

Devuelve la duración entre la primera hora de inicio y la última hora de finalización de las instrucciones sin retardo

Tipo de retorno

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 nivel bastante básico de los algoritmos cuánticos. Sin embargo, incluso dentro de este ámbito hay diferencias. Los programadores cuánticos suelen querer utilizar una amplia variedad de puertas e instrucciones, y trabajar en un régimen en el que todos los qubits interactúen entre sí. Sin embargo, el hardware cuántico suele tener un conjunto limitado de puertas nativas, y solo pueden interactuar determinados pares de qubits de hardware. Denominamos a estos dos regímenes «circuitos abstractos» y «circuitos físicos», respectivamente.

Qiskit tiene dos formas de distinguir un circuito que pretende ser físico. Se trata de una comprobación difusa, por razones históricas; originalmente, Qiskit nunca hizo distinción alguna (por eso transpile() se llama así, y no compile!). La forma más explícita es a través del atributo layout de los circuitos; si está activado, el circuito es ciertamente físico. La forma más antigua, más implícita, son los metadatos de los Qubit objetos e QuantumRegister instancias del circuito. Un circuito sólo puede considerarse físico (a juzgar por varias pasadas del transpilador) si contiene exactamente un registro cuántico, que se denomina q y posee todos los qubits del circuito en orden de índice. De nuevo por razones históricas, este es el valor por defecto para la forma QuantumCircuit(int [, int]) del constructor por defecto.

Normalmente, se crea un QuantumCircuit y lo construyes en sentido abstracto (sin tener en cuenta los metadatos del qubit). A continuación, llame a transpile() para compilar el circuito en un circuito compatible con hardware. Sin embargo, en los casos en los que quieras escribir un circuito eficiente en hardware desde el principio, puedes cortocircuitar toda la infraestructura de compilación utilizando el método ensure_physical() método. Esto garantizará que, independientemente de cómo hayas definido los metadatos qubit iniciales, se cumplan todos los requisitos para que el circuito se considere físico, con los índices qubit asignados a los qubits de hardware.

Para un control más completo sobre la elección de un mapeo y enrutamiento virtual a físico, consulte las etapas de mapeo y enrutamiento <transpiler-preset-stage-routing> de los pipelines de compilación de preajustes.

ensure_physical

ensure_physical(num_qubits=None, *, apply_layout=True)

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 especifica, amplía el circuito con ancillas hasta este tamaño. Las ancillas siempre serán los índices de qubit más altos del circuito. Si no se especifica (valor por defecto), el circuito mantiene el mismo ancho. Esta opción no se puede configurar si el circuito ya tiene un layout.
  • apply_layout (bool) – : si es verdadero (valor por defecto), configura el atributo layout del circuito de forma adecuada para que parezca que se ha diseñado con la disposición «trivial», incluida la expansión de los circuitos auxiliares, para un backend de ancho 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

estimate_fidelity

estimate_fidelity(target)

GitHub

Calcula la fidelidad de un circuito físico.

Esta función calculará el producto de las tasas de error de cada puerta del circuito para estimar la fidelidad del mismo:

..matemáticas::

label

fidelidad estimada del circuito

prod_ {g in text{gates}} bigl(1 - nombre_del_operador {error} (g)bigr)

donde error⁡(g)\operatorname{error}(g) es la tasa de error en el objetivo para la instrucción gg procedente del circuito del objetivo. Si el circuito no es físico, es decir, si alguna instrucción del circuito (como «operation» y «qargs») no se encuentra en el destino, se devolverá None. Este método no tiene por objeto realizar una simulación realista de la fidelidad de la ejecución en hardware real. Está diseñado para ofrecer una estimación de cómo funcionaría el transpilador, teniendo en cuenta el grado de precisión de las distintas heurísticas en su funcionamiento. Por lo general, solo resulta útil para comparar entre sí los resultados de diferentes compilaciones, con el fin de estimar cuál de ellos produciría una ejecución de mejor calidad en el hardware.

Parámetros

target (Target) – La Target instancia en la que se ejecutará el circuito y que se utilizará para obtener las tasas de error de las instrucciones del circuito.

Devuelve

La fidelidad estimada de la ejecución del circuito en el objetivo dado. Si alguna instrucción del circuito no está presente en el destino

Eleva

QiskitError – Si el circuito contiene alguna operación de flujo de control.

Tipo de retorno

float | None


Métodos similares a las instrucciones

QuantumCircuit también contiene un pequeño número de métodos que, en cuanto a los detalles, se parecen mucho Instructiona... Es muy posible que consigas una mejor integración y una mayor compatibilidad con las API si primero conviertes tu circuito a un Instruction (to_instruction()) o Gate un (to_gate()), según corresponda, y luego llamas al método correspondiente.

control

control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)

GitHub

Devuelve la versión controlada de este circuito.

El circuito original se convierte en una puerta lógica, y el circuito resultante contiene la versión controlada de dicha puerta. Esta puerta controlada se implementa como ControlledGate cuando annotated es False, y como AnnotatedOperation cuando annotated es True.

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. El valor predeterminado es 1.
  • label (str | None) – Una etiqueta opcional para identificar la compuerta controlada a efectos de visualización. El valor predeterminado es None. Se ignora si la puerta controlada se implementa como una operación anotada.
  • ctrl_state (str |int | None) – El estado de control de la puerta, especificado como un número entero o como una cadena de bits (p. ej., "110"). Si None, se establece por defecto en el estado en el que todos los bits son unos 2**num_ctrl_qubits - 1.
  • annotated (bool | None) – Indica si la puerta controlada debe implementarse como una puerta controlada o como una operación anotada.

Devuelve

La versión controlada de este circuito.

Tipo de retorno

QuantumCircuit

Eleva

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

inverse

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) – La potencia a la que se eleva este circuito.
  • matrix_power (bool) – indica si la puerta de potencia interna puede implementarse como una puerta unitaria.
  • annotated (bool) – indica si la puerta de potencia interna puede implementarse como una operación anotada.

Eleva

CircuitError - Si el circuito debe convertirse en una puerta unitaria, pero no es unitario.

Devuelve

Un circuito que implemente este circuito elevado a la potencia de power.

Tipo de retorno

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, barrier_label_len=16)

GitHub

Dibuja el circuito cuántico. Utilice el parámetro de salida para elegir el formato de dibujo:

text

Arte ASCII TextDrawing que se puede imprimir en la consola.

mpl

Imágenes con colores generados exclusivamente en Python utilizando matplotlib.

latex

Imágenes de alta calidad recopiladas a través de LaTeX.

Aviso

Esto, por su diseño, ejecutará una versión del pdflatex sistema instalada a partir de cualquier entrada del usuario (por ejemplo, para ejecutar código personalizado en Instruction.label), por lo que solo debe utilizarse con entradas de confianza.

latex_source

Salida sin procesar y sin compilar de « LaTeX ». Este es el código fuente de lo que mostraría el programa latex de dibujo.

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) – Selecciona el método de salida que se utilizará para dibujar el circuito. Las opciones válidas son text, mpl, latex, latex_source. Por defecto, se utiliza el text drawer, a menos que el archivo de configuración del usuario (normalmente ~/.qiskit/settings.conf) tenga un backend alternativo establecido como predeterminado. Por ejemplo, circuit_drawer = latex. Si se establece el parámetro «kwarg» de salida, siempre se utilizará ese backend en lugar del predeterminado en el archivo de configuración del usuario.

  • scale (float | None) – Escala de la imagen que se va a dibujar (reducir si < 1.0). Solo se utiliza en las salidas latex_source mpl, y latex . El valor por defecto es 1.0.

  • filename (str | None) – Ruta del archivo en el que se guardará la imagen. Por defecto, None (el resultado no se guarda en un archivo).

  • 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 se trata de un diccionario, cada entrada anula la configuración predeterminada. Si se especifica la "name" clave, la configuración predeterminada vendrá determinada por ese estilo. Por ejemplo, {"name": "textbook", "subfontsize": 5} carga el "textbook" estilo y establece el tamaño de la subfuente (por ejemplo, los ángulos de las compuertas) 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 ello mpl , es necesario que el backend de matplotlib utilizado admita esta función). Ten en cuenta que, si se utiliza con el tipo «texto» o con el tipo latex_source «salida», esto no tiene ningún efecto y se ignorará sin aviso. El valor por defecto es False.

  • reverse_bits (bool | None) – Cuando se establece en True, invierte el orden de los bits dentro de los registros para la visualización de la salida. El valor por defecto es a False menos que el archivo de configuración del usuario (normalmente ~/.qiskit/settings.conf) tenga establecido un valor alternativo. Por ejemplo, circuit_reverse_bits = True.

  • plot_barriers (bool) – Activa o desactiva las barreras de dibujo en el circuito de salida. El valor predeterminado es True.

  • justify (str | None) – Las opciones son "left", o "right" "none" (str). Si se especifica cualquier otra opción, se utilizará la alineación a la izquierda. Se refiere a dónde deben colocarse las puertas en el circuito de salida, si existe esa opción. none Esto hace que cada puerta se sitúe en su propia columna. El valor por defecto es left.

  • vertical_compression (str | None) –high, o medium low. Combina las líneas generadas por el texto resultante para que el dibujo ocupe menos espacio en vertical. El valor por defecto es medium. Solo se utiliza en la salida text ; en caso contrario, se ignorará sin aviso.

  • idle_wires (bool |str | None) – Incluir (o no) los cables inactivos (cables sin elementos de circuito) en la visualización de los resultados. También "auto" es posible utilizar la cadena; en ese caso, se muestran los cables inactivos, salvo cuando el circuito tiene un esquema adjunto. El valor por defecto es, a menos "auto" que en el archivo de configuración del usuario (normalmente ~/.qiskit/settings.conf) se haya establecido un valor alternativo. Por ejemplo, circuit_idle_wires = False.

  • with_layout (bool) – Incluir información sobre la disposición, con etiquetas en la disposición física. El valor predeterminado es True.

  • fold (int | None) – Establece la paginación. Se puede desactivar utilizando el valor « -1 ». En text, establece la longitud de las líneas. Esto resulta útil cuando el dibujo no cabe en la consola. Si se establece en «None» (valor predeterminado), intentará calcular el ancho de la consola utilizando shutil.get_terminal_size(). Sin embargo, si se ejecuta en Jupyter, la longitud predeterminada de la línea está fijada en 80 caracteres. En este caso mpl, se trata del número de capas (visuales) antes del plegado. El valor por defecto es 25.

  • ax (Any | None) – Solo utilizado por el backend mpl. Un objeto matplotlib.axes.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 cables de qubit y 00 a los cables clásicos. El valor predeterminado es False.

  • cregbundle (bool | None) – Si se establece en True, se agrupan los registros clásicos. El valor por defecto es True, salvo cuando output está configurado en "text".

  • wire_order (list[int] | None) – Una lista de números enteros que se utiliza para reordenar la visualización de los bits. La lista debe contener una entrada para cada bit, y los bits deben estar comprendidos entre 0 y (num_qubits + num_clbits).

  • expr_len (int) – El número de caracteres que se mostrarán si Expr se utiliza un 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 verdadero, dibuja una flecha desde cada recuadro de medida hacia abajo, hasta el bit o registro clásico en el que se encuentra el valor de la medida. Si es «False», no dibujes la flecha, sino que introduce el nombre del bit o del registro en el cuadro de medida. El valor por defecto es, a menos True que en el archivo de configuración del usuario (normalmente ~/.qiskit/settings.conf) se haya establecido un valor alternativo. Por ejemplo, circuit_measure_arrows = False.

  • barrier_label_len (int) – El número de caracteres que se mostrarán en las etiquetas Barrier del circuito de salida. Si se supera este número, la cadena se truncará en ese número y se añadirá «…» al final.

Devuelve

TextDrawing o matplotlib.figure o PIL.Image o str:

  • TextDrawing (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 que no están instaladas.

Ejemplo

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
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 que se van a descomponer. Puede ser un tipo de puerta, como HGate, o el nombre de una puerta, como «h», o una etiqueta de puerta, como «Mi puerta H», o una lista que combine cualquiera de estos elementos. Si se introduce el nombre de una puerta, se desglosarán todas las puertas con ese nombre, independientemente de si tienen etiquetas o no. Por defecto, se aplican a todas las puertas del circuito.
  • reps (int) – Número opcional de veces que se debe descomponer el circuito. Por ejemplo, reps=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, de una errata o solicite contenido en GitHub.