Skip to main content
IBM Quantum Platform

QuantumCircuit aula

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

GitHub

Bases: object

Representação do núcleo Qiskit de um circuito quântico.

Nota

Para obter mais detalhes sobre a definição do QuantumCircuit no contexto de todas as estruturas de dados que o acompanham, como ele se encaixa no restante do pacote qiskit e os diferentes regimes de descrições de circuitos quânticos no Qiskit, consulte a documentação em nível de módulo do qiskit.circuit.

Exemplo:

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 do circuito

QuantumCircuit tem um pequeno número de atributos públicos, que são, em sua maioria, funcionalidades mais antigas. A maior parte de sua funcionalidade é acessada por meio de métodos.

Um pequeno número de atributos é intencionalmente mutável, o restante são atributos de dados que devem ser considerados imutáveis.

Atributo mutável
Resumo
global_phaseA fase global do circuito, medida em radianos.
metadataMapeamento arbitrário do usuário, que o Qiskit preservará por meio do transpilador, mas que, de outra forma, será completamente ignorado.
nameUm nome de cadeia de caracteres opcional para o circuito.
Atributo de dados imutável
Resumo
ancillasLista de AncillaQubits rastreados pelo circuito.
cregsLista de ClassicalRegisters rastreados pelo circuito.
clbitsLista de Clbits rastreados pelo circuito.
dataLista de indivíduos CircuitInstructions que compõem o circuito.
_dataPython -identificador de espaço para o objeto da QkCircuit API C.
durationDuração total do circuito, adicionada pelo agendamento de passagens do transpilador. Esse atributo está obsoleto e estimate_duration() deve ser usado em seu lugar.
layoutInformações de layout de hardware e roteamento adicionadas pelo transpilador.
num_ancillasO número de qubits de ancilla no circuito.
num_clbitsO número de clbits no circuito.
num_captured_varsNúmero de variáveis clássicas capturadas em tempo real.
num_captured_stretchesNúmero de trechos capturados.
num_declared_varsNúmero de variáveis clássicas em tempo real declaradas localmente no escopo do circuito externo.
num_declared_stretchesNúmero de trechos declarados localmente no escopo do circuito externo.
num_input_varsNúmero de variáveis clássicas em tempo real de entrada.
num_parametersNúmero de tempos de compilação Parameters no circuito.
num_qubitsNúmero de qubits no circuito.
num_varsNúmero total de variáveis clássicas em tempo real no escopo do circuito externo.
num_stretchesNúmero total de trechos no escopo do circuito externo.
num_identifiersNúmero total de variáveis e trechos no circuito externo.
op_start_timesHorários de início das operações programadas, adicionados pelo agendamento de passagens do transpilador.
parametersVisão ordenada em forma de conjunto do tempo de compilação Parameters rastreados pelo circuito.
qregsLista de QuantumRegisters rastreados pelo circuito.
qubitsLista de Qubits rastreados pelo circuito.
unitA unidade do duration campo.

O atributo principal é data. Este é um objeto semelhante a uma sequência que expõe os CircuitInstructionelementos contidos nela de forma ordenada. Em geral, você não deve alterar este objeto diretamente; QuantumCircuit ele foi projetado apenas para operações de adição (que devem usar append()). A maioria das operações que modificam circuitos in situ deve ser implementada como passagens do transpiler (qiskit.transpiler). A API C interage com um objeto interno, chamado _data, que não faz parte da API pública Python, exceto como um identificador a ser passado para chamadas da API C.

data

Os dados do circuito (instruções e contexto).

Exemplo

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

Retorna

Um objeto do tipo lista que contém as CircuitInstruction instâncias do circuito.

Juntamente com o data, o global_phase de um circuito pode ter algum impacto em sua saída, se o circuito for usado para descrever um fenômeno Gate que pode ser controlado. Isso é medido em radianos e pode ser definido diretamente.

global_phase

A fase global do escopo do circuito atual em radianos.

Exemplo

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

O nome name de um circuito se torna o nome do Instruction ou Gate resultante de to_instruction() e to_gate() o que pode ser útil para visualizações.

name

Tipo: str

Um nome legível por humanos para o circuito.

Exemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

Você pode anexar metadata a um circuito. Nenhuma parte do Qiskit principal inspecionará isso ou alterará seu comportamento com base em metadados, mas isso será fielmente passado pelo transpilador, para que você mesmo possa marcar seus circuitos. Ao serializar um circuito com o QPY (consulte qiskit.qpy), os metadados serão serializados em JSON e talvez você precise passar um serializador personalizado para lidar com objetos não compatíveis com JSON dentro dele (consulte qpy.dump() para obter mais detalhes). Esse campo é ignorado durante a exportação para OpenQASM 2 ou 3.

metadata

Dicionário arbitrário de metadados definido pelo usuário para o circuito.

O Qiskit não examinará o conteúdo desse mapeamento, mas o passará pelo transpilador e o anexará novamente à saída, para que você possa rastrear seus próprios metadados.

Exemplo

from qiskit import QuantumCircuit

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

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

QuantumCircuit expõe atributos de dados rastreando seus bits e registros quânticos e clássicos internos. Eles aparecem como Python listmas você deve tratá-los como imutáveis; alterá-los não terá , na melhor das hipóteses, nenhum efeito e, mais provavelmente, simplesmente corromperá os dados internos do arquivo QuantumCircuit.

qregs

Uma lista de Qubits na ordem em que foram adicionados. Você não deve alterar isso.

cregs

Uma lista de Clbits na ordem em que foram adicionados. Você não deve alterar isso.

qubits

Uma lista de Qubits na ordem em que foram adicionados. Você não deve alterar isso.

ancillas

Uma lista de AncillaQubits na ordem em que foram adicionados. Você não deve alterar isso.

clbits

Uma lista de Clbits na ordem em que foram adicionados. Você não deve alterar isso.

Exemplo

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

Os parâmetros de tempo de compilação presentes nas instruções do circuito estão disponíveis em parameters. Isso tem uma ordem canônica (principalmente lexical, exceto no caso de ParameterVector), que corresponde à ordem em que os parâmetros serão atribuídos ao usar as formas de lista de assign_parameters()mas também suporta set-como o teste de associação em tempo constante.

parameters

Os parâmetros definidos no circuito.

Esse atributo retorna os Parameter objetos no circuito classificados em ordem alfabética. Observe que os parâmetros instanciados com um ParameterVector ainda são classificados numericamente.

Exemplos

O trecho abaixo mostra que a ordem de inserção dos parâmetros não 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)])

Lembre-se de que a classificação alfabética pode não ser intuitiva quando se trata de números. O literal "10" vem antes do "2" em uma classificação alfabética rigorosa.

>>> 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 respeitar a classificação numérica, um ParameterVector pode ser usado.

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

Retorna

Os objetos Parameter classificados no circuito.

Se você tiver transpilado seu circuito, de modo que tenha um circuito físico, poderá inspecionar o atributo layout para obter informações armazenadas pelo transpilador sobre como os qubits virtuais do circuito de origem são mapeados para os qubits de hardware de seu circuito físico, tanto no início quanto no final do circuito.

layout

Retorna qualquer informação de layout associada sobre o circuito.

Esse atributo contém um objeto TranspileLayout objeto. Normalmente, isso é definido na saída de transpile() ou PassManager.run() para reter informações sobre as permutações causadas no circuito de entrada pela transpilação.

Há dois tipos de permutações causadas pela função transpile() um layout inicial que permuta os qubits com base nos qubits físicos selecionados na função Targete um layout final, que é uma permutação de saída causada por SwapGates inseridos durante o roteamento.

Exemplo

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]

Se o seu circuito também tiver sido programado como parte de uma transpilação, ele exporá os tempos individuais de cada instrução, juntamente com o total duration do circuito.

duration

A duração total do circuito, definida por uma passagem do transpilador de agendamento. Sua unidade é especificada por unit.

Descontinuado desde a versão 1.3.0

A propriedade qiskit.circuit.quantumcircuit.QuantumCircuit.duration está obsoleta desde o Qiskit 1.3.0. Ele será removido no Qiskit 3.0.0.

unit

A unidade em que duration é especificada em.

Descontinuado desde a versão 1.3.0

A propriedade qiskit.circuit.quantumcircuit.QuantumCircuit.unit está obsoleta desde o Qiskit 1.3.0. Ele será removido no Qiskit 3.0.0.

op_start_times

Retorna uma lista de horas de início da operação.

Nota

Esse atributo calcula o tempo estimado de início das operações no circuito programado e só funciona para circuitos simples que não têm fluxo de controle ou outras operações clássicas de alimentação.

Esse atributo é ativado quando uma das passagens de análise de agendamento é executada no circuito quântico.

Exemplo

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

Retorna

Lista de números inteiros que representam os horários de início estimados das instruções. O índice corresponde ao índice da instrução em QuantumCircuit.data.

Aumentos

AttributeError - Quando o circuito não está programado.

Finalmente, QuantumCircuit expõe várias propriedades simples como atributos numéricos dinâmicos somente leitura.

num_ancillas

Retorna o número de qubits ancilla.

Exemplo

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

Retorna o número de bits clássicos.

Exemplo

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

O número de variáveis clássicas em tempo real no circuito marcadas como capturadas de um escopo de fechamento.

Esse é o comprimento do iter_captured_vars() iterável. Se esse valor for diferente de zero, num_input_vars deve ser zero.

num_captured_stretches

O número de trechos no circuito marcados como capturados em um escopo de cobertura.

Esse é o comprimento do iter_captured_stretches() iterável. Se esse valor for diferente de zero, num_input_vars deve ser zero.

num_declared_vars

O número de variáveis clássicas em tempo real no circuito que são declaradas por esse escopo de circuito, excluindo entradas ou capturas.

Esse é o comprimento do iter_declared_vars() iterável.

num_declared_stretches

O número de trechos no circuito que são declarados por esse escopo de circuito, excluindo as capturas.

Esse é o comprimento do iter_declared_stretches() iterável.

num_input_vars

O número de variáveis clássicas em tempo real no circuito marcadas como entradas do circuito.

Esse é o comprimento do iter_input_vars() iterável. Se esse valor for diferente de zero, num_captured_vars deve ser zero.

num_identifiers

O número de variáveis e trechos clássicos em tempo real no circuito.

Isso é igual a num_vars() + num_stretches().

num_parameters

O número de objetos de parâmetro no circuito.

num_qubits

Retorna o número de qubits.

num_stretches

O número de trechos no circuito.

Esse é o comprimento do iter_stretches() iterável.

num_vars

O número de variáveis clássicas em tempo real no circuito.

Esse é o comprimento do iter_vars() iterável.


Criando novos circuitos

Método
Resumo
__init__()Construtor padrão de circuitos sem instrução.
copy()Faça uma cópia completa de um circuito existente.
copy_empty_like()Copie objetos de dados de um circuito para um novo sem nenhuma instrução.
from_instructions()Inferir objetos de dados necessários a partir de uma lista de instruções.
from_qasm_file()Interface legada para qasm2.load().
from_qasm_str()Interface legada para qasm2.loads().

O construtor padrão (QuantumCircuit(...)) produz um circuito sem instruções iniciais. Os argumentos para o construtor padrão podem ser usados para semear o circuito com armazenamento de dados quânticos e clássicos e para fornecer um nome, uma fase global e metadados arbitrários. Todos esses campos podem ser expandidos posteriormente.

__init__

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

GitHub

Construtor padrão de QuantumCircuit.

Parâmetros

  • regs (Register |int |Sequence[Bit]) –

    Os registros a serem incluídos no circuito.

    • Se uma lista de objetos Register representa os objetos QuantumRegister e/ou ClassicalRegister objetos a serem incluídos no circuito.

      Por exemplo:

      • QuantumCircuit(QuantumRegister(4))
      • QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))
      • QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
    • Se for uma lista de int, a quantidade de qubits e/ou bits clássicos a serem incluídos no circuito. Pode ser um único int para apenas o número de bits quânticos ou 2 ints para o número de bits quânticos e bits clássicos, respectivamente.

      Por exemplo:

      • QuantumCircuit(4) # A QuantumCircuit with 4 qubits
      • QuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
    • Se uma lista de listas python contendo Bit objetos, uma coleção de Bit s a ser adicionada ao circuito.

  • name (str | None) – o nome do circuito quântico. Se não for definido, será atribuída uma cadeia de caracteres gerada automaticamente.

  • global_phase (ParameterExpression |float) – A fase global do circuito em radianos.

  • metadata (dict | None) – Metadados arbitrários de valor-chave para associar ao circuito. Isso é armazenado como dados de forma livre em um dict no atributo metadata atributo. Ele não será usado diretamente no circuito.

  • inputs (Iterable[Var]) – algumas variáveis a serem declaradas como variáveis input de tempo de execução para este circuito. Esses já devem ser nós expr.Var existentes que você criou em outro lugar; se precisar criar as entradas também, use QuantumCircuit.add_input(). As variáveis fornecidas neste argumento serão passadas diretamente para add_input(). Um circuito não pode ter tanto inputs quanto captures.

  • captures (Iterable[Var |Stretch]) – quaisquer variáveis que este escopo de circuito deva herdar de um escopo contido. As variáveis aqui indicadas serão passadas diretamente para add_capture(). Um circuito não pode ter tanto inputs quanto captures.

  • declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –

    quaisquer variáveis que esse circuito deva declarar e inicializar imediatamente. Você pode ordenar essa entrada de modo que as declarações posteriores dependam das anteriores (incluindo entradas ou capturas). Se você precisar depender de valores que serão computados posteriormente em tempo de execução, use add_var() em um ponto apropriado na execução do circuito.

    Esse argumento destina-se à inicialização conveniente do circuito quando você já tem um conjunto de variáveis criadas. As variáveis usadas aqui serão passadas diretamente para add_var()que você pode usar diretamente se esta for a primeira vez que estiver criando a variável.

Aumentos

  • CircuitError - se o nome do circuito, se fornecido, não for válido.
  • CircuitError - se ambos inputs e captures forem fornecidos.

Se você tiver um circuito existente, poderá produzir uma cópia dele usando copy()incluindo todas as suas instruções. Isso é útil se você quiser manter circuitos parciais enquanto estende outro, ou para ter uma versão que possa sofrer mutação no local, deixando a anterior intacta.

copy

copy(name=None)

GitHub

Copie o circuito.

Parâmetros

name (str) – nome a ser dado ao circuito copiado. Se for None, o nome permanecerá o mesmo.

Retorna

uma cópia profunda do circuito atual, com o nome especificado

Tipo de retorno

QuantumCircuit

Da mesma forma, se você quiser um circuito que contenha todos os mesmos objetos de dados (bits, registros, variáveis etc.), mas sem nenhuma das instruções, pode usar copy_empty_like(). Isso é bastante comum quando se deseja criar uma nova camada de um circuito para depois aplicá-la na parte de trás com compose(), ou para reescrever completamente as instruções de um circuito.

copy_empty_like

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

GitHub

Retorna uma cópia de self com a mesma estrutura, mas vazia.

Essa estrutura inclui:

  • nome e outros metadados
  • fase global
  • todos os qubits e clbits, inclusive os registros
  • as variáveis de tempo real definidas no circuito, tratadas de acordo com o argumento da palavra-chave vars .
Aviso

Se o circuito contiver quaisquer declarações de variáveis locais (aquelas adicionadas pelo declarations argumento para o construtor do circuito, ou usando add_var() ), eles podem não estar inicializados no circuito de saída. Você precisará adicionar manualmente instruções de armazenamento para eles (consulte Store e QuantumCircuit.store()) para inicializá-los.

Parâmetros

  • name (str | None) – Nome do circuito copiado. Se for None, o nome permanecerá o mesmo.

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

    O modo de tratamento de variáveis em tempo real.

    semelhantes

    As variáveis no circuito de saída terão a mesma semântica de declaração que no circuito original. Por exemplo, as variáveis input na fonte serão variáveis input no circuito de saída. Observe que isso faz com que as variáveis locais não sejam inicializadas, pois os armazenamentos não são copiados. Isso pode deixar o circuito em um estado potencialmente perigoso para os usuários se eles não adicionarem novamente os armazenamentos do inicializador.

    capturas

    Todas as variáveis serão convertidas em variáveis capturadas. Isso é útil quando se está construindo uma nova camada para um circuito existente que se deseja colocar na base compose() na base, pois compose() pode incorporar capturas ao circuito de base (mas não a outras variáveis).

    **DROP **

    O circuito de saída não terá variáveis definidas.

Retorna

Uma cópia vazia de si mesmo.

Tipo de retorno

QuantumCircuit

Em alguns casos, é mais conveniente gerar uma lista de CircuitInstructions separadamente para um contexto de circuito inteiro e, em seguida, criar um circuito a partir dela. O construtor from_instructions() capturará automaticamente todos os Qubit e Clbit usadas nas instruções e criará um novo objeto QuantumCircuit que possui os recursos corretos e todas as instruções.

from_instructions

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

GitHub

Construa um circuito a partir de um iterável 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]]]) – As instruções a serem adicionadas ao circuito.
  • qubits (Iterable[Qubit]) – Quaisquer qubits a serem adicionados ao circuito. Esse argumento pode ser usado, por exemplo, para impor uma ordem específica de qubits.
  • clbits (Iterable[Clbit]) – Quaisquer bits clássicos para adicionar ao circuito. Esse argumento pode ser usado, por exemplo, para impor uma ordem específica de bits clássicos.
  • name (str | None) – O nome do circuito.
  • global_phase (ParameterValueType) – A fase global do circuito em radianos.
  • metadata (dict | None) – Metadados arbitrários de valor-chave para associar ao circuito.

Retorna

O circuito quântico.

Tipo de retorno

QuantumCircuit

QuantumCircuit também ainda tem dois métodos construtores que são invólucros legados em torno dos importadores em qiskit.qasm2. Eles aplicam automaticamente as configurações de compatibilidade herdada de load() e loads().

from_qasm_file

static from_qasm_file(path)

GitHub

Leia um programa OpenQASM 2.0 de um arquivo e converta-o em uma instância do QuantumCircuit.

Parâmetros

path (str |PathLike) – Caminho para o arquivo de um programa do OpenQASM 2

Retorna

O objeto QuantumCircuit para a entrada OpenQASM 2.

Tipo de retorno

QuantumCircuit

Veja Também

qasm2.load(): a interface completa do importador OpenQASM 2.

from_qasm_str

static from_qasm_str(qasm_str)

GitHub

Converta uma string contendo um programa OpenQASM 2.0 em um arquivo QuantumCircuit.

Parâmetros

qasm_str (str) – Uma cadeia de caracteres que contém um programa OpenQASM 2.0.

Retorna

O objeto QuantumCircuit para a entrada OpenQASM 2

Tipo de retorno

QuantumCircuit

Veja Também

qasm2.loads(): a interface completa do importador OpenQASM 2.


Objetos de dados em circuitos

Adicionando objetos de dados

Método
Adiciona esse tipo de dados
add_bits()Qubits e Clbits.
add_register()QuantumRegister e ClassicalRegister.
add_var()Var com escopo e inicializadores locais.
add_stretch()Stretch nós com escopo local.
add_input()Var nós que são tratados como entradas do circuito.
add_capture()Var ou Stretch nós capturados de escopos que os contêm.
add_uninitialized_var()Var nós com escopo local e estado indefinido.

Normalmente, você adiciona a maioria dos objetos de dados (Qubit, Clbit, ClassicalRegister, etc.) ao circuito como parte do uso do construtor __init__() construtor padrão, ou copy_empty_like(). No entanto, também é possível adicioná-los posteriormente. Dados clássicos tipados, como nós autônomos Var (consulte Computação clássica em tempo real ), podem ser construídos e adicionados com métodos separados.

Novo sem registro Qubit e Clbit são adicionados usando add_bits(). Esses objetos não devem estar presentes no circuito. Você pode verificar se um bit já existe no circuito usando find_bit().

add_bits

add_bits(bits)

GitHub

Adicione bits ao circuito.

Aviso

Se o circuito quântico tiver um atributo layout existente, adicionar um atributo Qubit só aumentará o número de qubits. Ele não atualizará o layout.

Parâmetros

bits (Iterable[Bit])

Tipo de retorno

Nenhum

Os registros são adicionados ao circuito com add_register(). Nesse método, não é um erro se alguns dos bits já estiverem presentes no circuito. Nesse caso, o registro será um "alias" sobre os bits. Isso geralmente não é bem suportado pelos back-ends de hardware; provavelmente é melhor não depender dele. Os registros em que um determinado bit se encontra fazem parte do retorno de find_bit().

add_register

add_register(*regs)

GitHub

Adicione registros.

Aviso

Se o circuito quântico tiver um atributo layout existente, adicionar um atributo QuantumRegister só aumentará o número de qubits. Ele não atualizará o layout.

Parâmetros

regs (Register |int |Sequence[Bit])

Tipo de retorno

Nenhum

Os dados clássicos digitados em tempo real são representados no circuito por Var nós com uma função bem definida Type. É possível instanciá-los separadamente em um circuito (consulte Var.new()), mas geralmente é mais conveniente usar métodos de circuito que gerenciarão automaticamente os tipos e a inicialização da expressão para você. Os dois métodos mais comuns são add_var() (variáveis com escopo local) e add_input() (entradas para o circuito). Além disso, o método add_stretch() pode ser usado para adicionar trechos ao circuito.

add_var

add_var(name_or_var, /, initial)

GitHub

Adicione uma variável clássica com armazenamento automático e escopo a esse circuito.

Considera-se que a variável foi "declarada" no início do circuito, mas ela só é inicializada no ponto do circuito em que você chama esse método, portanto, ela pode depender de variáveis definidas antes dela.

Parâmetros

  • name_or_var (str |Var) – uma string do nome da variável ou uma instância existente para Var reutilização. As variáveis não podem ocultar nomes que já estejam em uso no circuito.

  • initial (Any) –

    o valor com o qual inicializar essa variável. Se o primeiro argumento foi fornecido como um nome de cadeia de caracteres, o tipo da variável resultante é inferido a partir da expressão inicial; para controlar isso mais manualmente, use Var.new() para construir manualmente uma nova variável com o tipo desejado ou use expr.cast() para converter o inicializador para o tipo desejado.

    Isso deve ser um nó Expr ou um valor que pode ser elevado a um nó usando expr.lift.

Retorna

A variável criada. Se uma instância Var tiver sido fornecida, será retornado exatamente o mesmo objeto.

Aumentos

CircuitError - se a variável não puder ser criada devido à sombra de um identificador existente.

Tipo de retorno

Var

Exemplos

Defina uma nova variável com apenas um nome e uma expressão inicializadora:

from qiskit.circuit import QuantumCircuit

qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)

Reutilizar uma variável que pode ter sido retirada de um circuito relacionado ou construída manualmente e inicializá-la com alguma expressão mais 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

Registre uma variável como uma entrada para o circuito.

Parâmetros

  • name_or_var (str |Var) – um nome de string ou um nó Var existente a ser usado como variável de entrada.
  • type (tipo ) - se o nome for fornecido como uma cadeia de caracteres, então esse deve ser um tipo Type a ser usada para a variável. Se a variável for fornecida como um objeto existente Varexistente, ela não deverá ser fornecida e, em vez disso, será lida do próprio objeto.
  • type_ (Type | None)

Retorna

a variável criada ou a mesma variável que foi passada.

Aumentos

CircuitError - se a variável não puder ser criada devido à sombra de uma variável existente.

Tipo de retorno

Var

add_stretch

add_stretch(name_or_stretch)

GitHub

Declara um novo trecho com escopo para esse circuito.

Parâmetros

name_or_stretch (str |Stretch) – uma string com o nome do stretch ou uma instância existente para Stretch reutilização. Os trechos não podem ter nomes que já estejam em uso no circuito.

Retorna

O trecho criado. Se uma instância Stretch tiver sido fornecida, será retornado exatamente o mesmo objeto.

Aumentos

CircuitError - se o trecho não puder ser criado devido à sombra de um identificador existente.

Tipo de retorno

Alongamento

Exemplos

Definir e usar um novo trecho com apenas um nome:

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)

Além disso, há dois métodos de nível inferior que podem ser úteis para a geração programática de circuitos. Ao trabalhar de forma interativa, você provavelmente não precisará deles; a maioria dos usos de add_uninitialized_var() fazem parte de copy_empty_like()e a maioria dos usos de add_capture() seria melhor se usasse a interface do construtor de fluxo de controle.

add_uninitialized_var

add_uninitialized_var(var, /)

GitHub

Adicionar uma variável sem inicializador.

Na maioria dos casos, você deve usar add_var() para inicializar a variável. Para usar essa função, você já deve ter uma instância Var pois o uso da função normalmente só faz sentido em contextos de cópia.

Aviso

O Qiskit não faz afirmações sobre como uma variável não inicializada será avaliada em tempo de execução, e alguns hardwares podem rejeitar isso como um erro.

Você deve tratar essa função com cautela e como uma primitiva de baixo nível que é útil somente em casos especiais de reconstrução programática de dois circuitos semelhantes.

Parâmetros

var (Var) – a variável a ser adicionada.

add_capture

add_capture(var: Var)

add_capture(stretch: Stretch)

GitHub

Adicione um identificador ao circuito que ele deve capturar de um escopo no qual estará contido.

Esse método requer um Var ou Stretch para garantir que você tenha uma alça para um identificador, pois será necessário declarar o mesmo identificador usando o mesmo objeto no circuito externo.

Esse é um método de baixo nível, que só é realmente útil se você estiver construindo manualmente operações de fluxo de controle. Normalmente, não será necessário chamar esse método, desde que você esteja usando a interface do construtor para escopos de fluxo de controle (with context-manager statements for if_test() e outras construções de escopo). A interface do construtor criará automaticamente os fechamentos de escopos internos em seu nome, capturando todos os identificadores usados neles.

Parâmetros

var (Union[expr.Var, expr.Stretch]) – a variável ou trecho a ser capturado de um escopo adjacente.

Aumentos

CircuitError - se o identificador não puder ser criado devido à sombra de um identificador existente.

Trabalhando com bits e registros

Uma Bit instância é, por si só, apenas um identificador único para os circuitos utilizarem em seus próprios contextos. Se você tiver uma Bit instância e um circuito, poderá identificar os contextos em que o bit está presente usando find_bit(), como seu índice inteiro no circuito e quaisquer registros em que ele esteja contido.

find_bit

find_bit(bit)

GitHub

Encontre locais no circuito que possam ser usados para referenciar um determinado Bit.

Em particular, essa função pode encontrar o índice inteiro de um qubit, que corresponde ao seu índice de hardware para um circuito transpilado.

Nota

O índice do circuito de um AncillaQubit será seu índice em qubitse não ancillas.

Parâmetros

bit (Bit) – O bit a ser localizado.

Retorna

Um conjunto de 2. O primeiro elemento (index) contém o índice no qual o Bit pode ser encontrado (em qubits, clbits, dependendo de seu tipo). O segundo elemento (registers) é uma lista de pares (register, index) com uma entrada para cada Register no circuito que contém o Bit (e o índice no Register no qual ele pode ser encontrado).

Tipo de retorno

namedtuple (int, List[Tuple (Register, int )])

Aumentos

  • CircuitError - Se o arquivo fornecido Bit fornecido for de um tipo desconhecido.
  • CircuitError - Se o cabo fornecido Bit não puder ser encontrado no circuito.

Exemplos

Percorrer um circuito, obtendo os índices de qubit e clbit de cada operação:

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
]

Da mesma forma, você pode consultar um circuito para ver se um registro já foi adicionado a ele usando has_register().

has_register

has_register(register)

GitHub

Teste se esse circuito tem o registro r.

Parâmetros

register (Register) – um registro quântico ou clássico.

Retorna

Verdadeiro se o registro estiver contido nesse circuito.

Tipo de retorno

bool

Trabalhando com parâmetros de tempo de compilação

Veja Também

Parametrização em tempo de compilação

Uma discussão mais completa sobre o que é parametrização em tempo de compilação e como ela se encaixa no modelo de dados do Qiskit.

Diferentemente de bits, registros e dados clássicos digitados em tempo real, os parâmetros simbólicos em tempo de compilação não são adicionados manualmente a um circuito. Sua presença é inferida por estar contida em operações adicionadas aos circuitos e à fase global. Uma lista ordenada de todos os parâmetros atualmente em um circuito está em QuantumCircuit.parameters.

A operação mais comum em instâncias Parameter é substituí-las em operações simbólicas por algum valor numérico ou outra expressão simbólica. Isso é feito com 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

Atribuir parâmetros a novos parâmetros ou valores.

Se parameters for passado como um dicionário, as chaves deverão ser Parameter instâncias no circuito atual. Os valores do dicionário podem ser valores numéricos ou novos objetos de parâmetro.

Se parameters for passado como uma lista ou matriz, os elementos serão atribuídos aos parâmetros atuais na ordem de parameters que é classificada em ordem alfabética (respeitando a ordem nos objetos ParameterVector objetos).

Os valores podem ser atribuídos ao objeto do circuito atual ou a uma cópia dele.

Nota

Quando parameters é fornecido como um mapeamento, é permitido ter chaves que sejam cadeias de caracteres dos nomes dos parâmetros; elas serão pesquisadas usando get_parameter(). Você também pode ter chaves que são instâncias ParameterVector e, nesse caso, o valor do dicionário deve ser uma sequência de valores com o mesmo comprimento do vetor.

Se você usar qualquer um desses casos, deverá deixar a configuração flat_input=False; alterá-la para True ativa o caminho rápido, em que todas as chaves devem ser Parameter instâncias.

Parâmetros

  • parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – Um dicionário ou um objeto iterável que especifique os novos valores dos parâmetros.
  • inplace (bool) – Se for False, é retornada uma cópia do circuito com os parâmetros definidos. Se for True, a própria instância do circuito é modificada.
  • flat_input (bool) – Se True e parameters é um tipo de mapeamento, presume-se que seja exatamente um mapeamento de {parameter: value}. Por padrão (False), o mapeamento também pode conter ParameterVector chaves que apontam para uma sequência correspondente de valores, e estas serão desdobradas durante o mapeamento, ou chaves de string, que serão convertidas em Parameter instâncias usando get_parameter().
  • strict (bool) – Se houver False, quaisquer parâmetros especificados no mapeamento que não sejam utilizados no circuito serão ignorados. Se True (padrão), será gerado um erro indicando um erro lógico.

Aumentos

  • CircuitError - Se parameters for um dict e contiver parâmetros não presentes no circuito.
  • ValueError - Se os parâmetros forem uma lista/vetor e o comprimento não corresponder ao número de parâmetros livres no circuito.

Retorna

Uma cópia do circuito com parâmetros vinculados se inplace for False; caso contrário, None.

Tipo de retorno

QuantumCircuit | Nenhum

Exemplos

Crie um circuito parametrizado e atribua os parâmetros no local.

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 de circuito gerado pelo código anterior.Diagrama de circuito gerado pelo código anterior.

Associe os valores fora do lugar por lista e obtenha uma cópia do 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 de circuito gerado pelo código anterior.Diagrama de circuito gerado pelo código anterior.

O circuito rastreia os parâmetros por Parameter e proíbe ter vários parâmetros com o mesmo nome para evitar alguns problemas ao interoperar com OpenQASM ou outros formatos externos. Você pode usar has_parameter() e get_parameter() para consultar o circuito em busca de um parâmetro com o nome de string fornecido.

has_parameter

has_parameter(name_or_param, /)

GitHub

Verificar se existe um objeto de parâmetro nesse circuito.

Parâmetros

name_or_param (str |Parameter) – o parâmetro ou o nome de um parâmetro a ser verificado. Se esse for um nó Parameter o parâmetro deve ser exatamente o parâmetro fornecido para que essa função retorne True.

Retorna

se um parâmetro de correspondência pode ser atribuído nesse circuito.

Tipo de retorno

bool

Veja Também

QuantumCircuit.get_parameter()

Recupera a instância Parameter desse circuito por nome.

QuantumCircuit.has_var()

Um método semelhante a esse, mas para variáveis de tempo de execução expr.Var em vez de variáveis de tempo de compilação Parameters.

get_parameter

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

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

GitHub

Recupera um parâmetro de tempo de compilação que é acessível nesse escopo de circuito por nome.

Parâmetros

  • name (str) – o nome do parâmetro a ser recuperado.
  • default (Any) – Se fornecido, esse valor será retornado caso o parâmetro não esteja presente. Se não for fornecido, é gerada KeyError uma exceção.

Retorna

O parâmetro correspondente.

Aumentos

KeyError - se nenhum padrão for fornecido, mas o parâmetro não existir no circuito.

Tipo de retorno

Parâmetro

Exemplos

Recuperar um parâmetro por nome em um circuito:

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

Obtém uma variável de um circuito pelo nome, retornando algum padrão se ela não estiver presente:

assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is None
Veja Também

get_var()

Um método semelhante, mas para expr.Var variáveis de tempo de execução em vez de Parameter parâmetros de tempo de compilação.

Trabalhando com dados clássicos digitados em tempo real

Veja Também

qiskit.circuit.classical

Documentação em nível de módulo sobre como funcionam os sistemas de variáveis, expressões e tipos, os objetos usados para representá-los e as operações clássicas disponíveis.

Computação clássica em tempo real

Uma discussão sobre como os dados em tempo real se encaixam em todo o qiskit.circuit modelo de dados como um todo.

Adição de objetos de dados

Os métodos para adicionar novos Var ou Stretch identificadores a um circuito após a inicialização.

Você pode recuperar identificadores anexados a um circuito (por exemplo, um Var ou Stretch) por nome com os métodos get_var(), get_stretch(), ou get_identifier(). Você também pode verificar se um circuito contém um determinado identificador com has_var(), has_stretch(), ou has_identifier().

get_var

get_var(name: str, default: T) → Var | T

get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var

GitHub

Recupera uma variável que pode ser acessada nesse escopo de circuito por nome.

Parâmetros

  • name (str) – o nome da variável a ser recuperada.
  • default (Any) – Se fornecido, esse valor será retornado caso a variável não exista. Se não for fornecido, é gerada KeyError uma exceção.

Retorna

A variável correspondente.

Aumentos

KeyError - se nenhum padrão for fornecido, mas a variável não existir.

Exemplos

Recuperar uma variável por nome em um 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

Obtém uma variável de um circuito pelo nome, retornando algum padrão se ela não estiver presente:

assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is None
Veja Também

get_parameter()

Um método semelhante, mas para Parameter parâmetros de tempo de compilação em vez de expr.Var variáveis de tempo de execução.

get_stretch

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

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

GitHub

Recupera um trecho que é acessível nesse escopo de circuito por nome.

Parâmetros

  • name (str) – o nome do trecho a ser recuperado.
  • default (Any) – Se fornecido, esse valor será retornado caso a variável não exista. Se não for fornecido, é gerada KeyError uma exceção.

Retorna

O trecho correspondente.

Aumentos

KeyError - se nenhum padrão for fornecido, mas a variável não existir.

Exemplos

Recuperar um trecho por nome em um 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

Obtém uma variável de um circuito pelo nome, retornando algum padrão se ela não estiver 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 um identificador que é acessível nesse escopo de circuito por nome.

Atualmente, isso inclui variáveis e extensões clássicas em tempo real.

Parâmetros

  • name (str) – o nome do identificador a ser recuperado.
  • default (Any) – Se fornecido, esse valor será retornado caso a variável não exista. Se não for fornecido, é gerada KeyError uma exceção.

Retorna

A variável correspondente.

Aumentos

KeyError - se nenhum padrão for fornecido, mas o identificador não existir.

Veja Também

get_var()

Obtém um identificador conhecido por ser uma expr.Var instância.

get_stretch()

Obtém um identificador conhecido por ser uma expr.Stretch instância.

get_parameter()

Um método semelhante, mas para Parameter parâmetros de tempo de compilação em vez de expr.Var variáveis de tempo de execução.

has_var

has_var(name_or_var, /)

GitHub

Verificar se uma variável está acessível nesse escopo.

Parâmetros

name_or_var (str |Var) – a variável ou o nome de uma variável a ser verificada. Se este for um expr.Var nó, a variável deve ser exatamente a fornecida para que esta função retorne True.

Retorna

se uma variável correspondente está acessível.

Tipo de retorno

bool

Veja Também

QuantumCircuit.get_var()

Recupera a instância expr.Var desse circuito por nome.

QuantumCircuit.has_parameter()

Um método semelhante a esse, mas para tempo de compilação Parameters em vez de variáveis de tempo de execução expr.Var variáveis.

has_stretch

has_stretch(name_or_stretch, /)

GitHub

Verifique se um trecho está acessível nesse escopo.

Parâmetros

name_or_stretch (str |Stretch) – o trecho ou nome de um trecho a ser verificado. Se este for um expr.Stretch nó, o alongamento deve ser exatamente o indicado para que esta função retorne True.

Retorna

se um trecho correspondente está acessível.

Tipo de retorno

bool

Veja Também

QuantumCircuit.get_stretch()

Recupera a instância expr.Stretch desse circuito por nome.

has_identifier

has_identifier(name_or_ident, /)

GitHub

Verificar se um identificador está acessível nesse escopo.

Parâmetros

name_or_ident (str |Var |Stretch) – a instância ou o nome do identificador a ser verificado. Se este for um nó expr.Var expr.Stretch ou, a instância correspondente deve ser exatamente a fornecida para que esta função retorne True.

Retorna

se um identificador correspondente está acessível.

Tipo de retorno

bool

Veja Também

QuantumCircuit.get_identifier()

Recupere o expr.Var ou expr.Stretch desse circuito por nome.

QuantumCircuit.has_var()

O mesmo que este método, mas ignorando qualquer coisa que não seja uma variável em tempo de execução expr.Var .

QuantumCircuit.has_stretch()

O mesmo que este método, mas ignorando qualquer coisa que não seja uma variável em tempo de execução expr.Stretch .

QuantumCircuit.has_parameter()

Um método semelhante a esse, mas para tempo de compilação Parameters em vez de variáveis de tempo de execução expr.Var variáveis.

Há também vários métodos iteradores que você pode usar para obter o conjunto completo de identificadores rastreados por um circuito. Pelo menos um de iter_input_vars() e iter_captured_vars() estará vazio, pois as entradas e as capturas são mutuamente exclusivas. Todos os iteradores têm propriedades dinâmicas correspondentes em QuantumCircuit que contêm seu comprimento: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_vars, ou num_declared_stretches.

iter_vars

iter_vars()

GitHub

Obtém um iterável sobre todas as variáveis clássicas em tempo real no escopo desse circuito.

Esse método itera sobre todas as variáveis no escopo. Para obter iteradores mais refinados, consulte iter_declared_vars(), iter_input_vars() e iter_captured_vars().

Tipo de retorno

Iterável[* Var* ]

iter_stretches

iter_stretches()

GitHub

Obtém um iterável sobre todos os trechos no escopo desse circuito.

Esse método itera sobre todas as extensões no escopo. Para obter iteradores mais refinados, consulte iter_declared_stretches() e iter_captured_stretches().

Tipo de retorno

Iterável[* Stretch* ]

iter_input_vars

iter_input_vars()

GitHub

Obtém um iterável sobre todas as variáveis clássicas em tempo real que são declaradas como entradas para esse escopo de circuito. Isso exclui variáveis declaradas localmente (consulte iter_declared_vars()) e variáveis capturadas (consulte iter_captured_vars()).

Tipo de retorno

Iterável[* Var* ]

iter_captured_vars

iter_captured_vars()

GitHub

Obtém um iterável sobre todas as variáveis clássicas em tempo real que são capturadas por esse escopo de circuito a partir de um escopo que o contém. Isso exclui variáveis de entrada (consulte iter_input_vars()) e variáveis declaradas localmente (consulte iter_declared_vars()).

Tipo de retorno

Iterável[* Var* ]

iter_captured_stretches

iter_captured_stretches()

GitHub

Obtém um iterável sobre trechos que são capturados por esse escopo de circuito a partir de um escopo que o contém. Isso exclui os trechos declarados localmente (consulte iter_declared_stretches()).

Tipo de retorno

Iterável[* Stretch* ]

iter_declared_vars

iter_declared_vars()

GitHub

Obtém um iterável sobre todas as variáveis clássicas em tempo real que são declaradas com duração de armazenamento automático nesse escopo. Isso exclui as variáveis de entrada (consulte iter_input_vars()) e variáveis capturadas (consulte iter_captured_vars()).

Tipo de retorno

Iterável[* Var* ]

iter_declared_stretches

iter_declared_stretches()

GitHub

Obtém um iterável sobre todas as extensões declaradas nesse escopo. Isso exclui os trechos capturados (consulte iter_captured_stretches()).

Tipo de retorno

Iterável[* Stretch* ]


Adicionando operações aos circuitos

Você pode adicionar qualquer coisa que implemente a interface Operation a um circuito como uma única instrução, embora a maioria das coisas que você queira adicionar seja Instruction ou Gate instâncias.

Veja Também

Operações, instruções e portões

A qiskit.circuit-documentação de nível sobre as diferentes interfaces que o Qiskit usa para definir instruções em nível de circuito.

Métodos para adicionar operações gerais

Esses são os métodos básicos que lidam com a adição de qualquer objeto, inclusive os definidos pelo usuário, aos circuitos.

Método
Quando utilizá-lo
append()Adicionar uma instrução como um único objeto em um circuito.
_append()Igual a append()mas com uma interface de baixo nível que elimina quase toda a verificação de erros.
compose()Inline as instruções de um circuito em outro.
tensor()Como compose()mas estritamente para unir circuitos que agem em qubits separados.

QuantumCircuit há duas maneiras principais de adicionar mais operações a um circuito. A opção a ser usada depende do fato de você querer adicionar o objeto como uma única "instrução" (append()), ou se você deseja unir as instruções de dois circuitos (compose()).

Uma única instrução ou operação aparece como uma única entrada no data do circuito e como uma única caixa quando desenhada nos visualizadores de circuito (consulte draw()). Uma única instrução é a "unidade" na qual um backend de hardware pode ser definido em termos (consulte Target). Um Instruction pode vir com um definitionque é uma regra que o transpilador (consulte qiskit.transpiler) poderá recorrer a ela para decompô-la para o hardware, se necessário. Um Operation que não seja também um Instruction só pode ser decomposto se tiver algum método de síntese de alto nível associado registrado para ele (consulte qiskit.transpiler.passes.synthesis.plugin).

A QuantumCircuit por si só não é um único Instructioné um pouco mais complicado, pois pode, em geral, representar um programa completo com entradas e saídas de memória clássica tipada e fluxo de controle. O modelo de dados do Qiskit (e da maioria dos hardwares) ainda não tem o conceito de sub-rotinas reutilizáveis que podem ser chamadas com operandos quânticos virtuais. Você pode converter circuitos simples que atuam somente em qubits com operações unitárias em um Gate usando to_gate()e circuitos simples que atuam somente em qubits e clbits em um Instruction com to_instruction().

Quando você tem um Operation, Instruction, ou Gateadicione-o ao circuito, especificando os argumentos qubit e clbit com append().

append

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

GitHub

Anexar uma ou mais instruções ao final do circuito, modificando o circuito no local.

O qargs e o cargs serão expandidos e transmitidos de acordo com as regras do Instructione quaisquer especificadores nãoBit (como índices inteiros) serão resolvidos nas instâncias relevantes.

Se um CircuitInstruction for fornecido, ele será desembrulhado, verificado no contexto desse circuito, e um novo objeto será anexado ao circuito. Nesse caso, você não pode passar qargs ou cargs separadamente.

Parâmetros

Retorna

uma alça para os CircuitInstructions que foram de fato adicionados ao circuito.

Tipo de retorno

qiskit.circuit.InstructionSet

Aumentos

CircuitError - se a operação passada não for uma instância de Instruction .

append() faz uma verificação de erros bastante significativa para garantir que você não possa quebrar acidentalmente o modelo de dados do QuantumCircuit. Se você estiver gerando programaticamente um circuito a partir de dados conhecidos como bons, poderá evitar grande parte dessa verificação de erros usando o apêndice de caminho rápido _append()mas com o risco de que o chamador seja responsável por garantir que esteja passando apenas dados válidos.

_append

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

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

GitHub

Anexar uma instrução ao final do circuito, modificando o circuito no local.

Aviso

Essa é uma função interna de caminho rápido e é responsabilidade de quem a chama garantir que todos os argumentos sejam válidos; não há verificação de erros aqui. Em particular:

  • todos os qubits e clbits já devem existir no circuito e não pode haver duplicatas na lista.
  • quaisquer instruções de operações de fluxo de controle devem agir somente sobre as variáveis presentes no circuito.
  • o circuito não deve estar dentro de um contexto de construtor de fluxo de controle.
Nota

Essa função pode ser usada por chamadores que não sejam QuantumCircuit quando o chamador tiver certeza de que toda a verificação de erros, transmissão e escopo já foram executados, e a única referência ao circuito ao qual as instruções estão sendo anexadas estiver dentro da mesma função. Em particular, não é seguro chamar QuantumCircuit._append() em um circuito que é recebido por um argumento de função. Isso ocorre porque o QuantumCircuit._append() não reconhecerá as construções de escopo da interface do construtor de fluxo de controle.

Parâmetros

  • instrução -

    Uma descrição completa e bem formada CircuitInstruction da operação e seu contexto a ser adicionado.

    Na forma de compatibilidade herdada, isso pode ser um simples Operatione, nesse caso, qargs e cargs devem ser fornecidos explicitamente.

  • qargs - Argumento de legado para os qubits aos quais anexar o bare Operation a. Ignorado se o primeiro argumento estiver na forma preferencial CircuitInstruction preferencial.

  • cargs - Argumento de legado para clbits para anexar o bare Operation a. Ignorado se o primeiro argumento estiver na forma preferencial CircuitInstruction preferencial.

  • _standard_gate (bool)

Retorna

um identificador da instrução que acabou de ser adicionada.

Tipo de retorno

CircuitInstruction

Em outros casos, talvez você queira unir dois circuitos, aplicando as instruções de um circuito em qubits e clbits especificados em outro circuito. Essa operação de "inlining" é chamada de compose() no Qiskit. compose() é, em geral, mais poderoso do que um to_instruction()-plus-append() para unir dois circuitos, pois também pode vincular dados clássicos digitados e permite que as operações de fluxo de controle do circuito sejam unidas a outro circuito.

As desvantagens do compose() são o fato de ser uma operação mais complexa que pode envolver mais reescrita do operando e o fato de precisar necessariamente mover dados de um objeto de circuito para outro. Se estiver construindo um circuito para si mesmo e o desempenho bruto for um objetivo central, considere a possibilidade de passar seu circuito de base e fazer com que diferentes partes do seu algoritmo gravem diretamente no circuito de base, em vez de construir um circuito de camada temporária.

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 as instruções de um circuito em qubits e/ou clbits especificados em outro.

Nota

Por padrão, isso cria um novo objeto de circuito, deixando o site self intocado. Para a maioria dos usos dessa função, é muito mais eficiente definir inplace=True e modificar o circuito básico no local.

Ao lidar com variáveis em tempo real (expr.Var e expr.Stretch existem duas estratégias principais para usar compose():

  1. O circuito other é tratado como totalmente aditivo, inclusive suas variáveis. As variáveis em other devem ser totalmente distintas das variáveis em self (use var_remap para ajudar nisso), e todas as variáveis em other serão declaradas novamente na saída com o escopo de entrada/captura/local correspondente ao modo como estão em other. Geralmente, é isso que você deseja se estiver unindo dois circuitos não relacionados.
  2. O circuito other foi criado como uma extensão exata do self para ser incorporado a ele, inclusive atuando sobre as variáveis existentes em seus estados no final do self. Nesse caso, o site other deve ser criado com todas essas variáveis a serem incluídas declaradas como "capturas" e, em seguida, você pode usar o site inline_captures=True nesse método para vinculá-las. Geralmente, isso é o que você deseja se estiver construindo um circuito definindo camadas em tempo real ou reconstruindo um circuito usando camadas retiradas dele mesmo. Você pode achar o argumento vars_mode="captures" para copy_empty_like() útil para criar a base de cada camada, nesse caso.

Parâmetros

  • other (qiskit.circuit.Instruction orQuantumCircuit) – (sub)circuito ou instrução para compor em si mesmo. Se não for um QuantumCircuitpode ser qualquer coisa que o append aceite.

  • qubits (list[Qubit|int]) – qubits do eu para compor.

  • clbits (list[Clbit|int]) – fragmentos de si mesmo para compor.

  • front (bool) – Se True, a composição frontal será executada. Isso não é possível nos gerenciadores de contexto do construtor de fluxo de controle.

  • inplace (bool) – Se True, modifique o objeto. Caso contrário, retorne o circuito composto.

  • copy (bool) – Se for True (o padrão), a entrada será tratada como compartilhada e todas as instruções contidas serão copiadas, caso precisem ser alteradas no futuro. Você pode definir esse valor como False se a entrada for considerada propriedade do circuito base, a fim de evitar cópias desnecessárias; nesse caso, não é válido usar other posteriormente, e algumas instruções podem ter sofrido mutação no local.

  • var_remap (Mapping) –

    mapeamento a ser usado para reescrever expr.Var e expr.Stretch em other à medida que são incorporados em self. Isso pode ser usado para evitar conflitos de nomes.

    Tanto as chaves quanto os valores podem ser fornecidos como cadeias de caracteres ou instâncias de identificadores diretos. Se uma chave for uma string, ela corresponderá a qualquer Var ou Stretch com o mesmo nome. Se um valor for uma string, sempre que uma nova chave corresponder a ele, um novo Var ou Stretch é criado com o tipo correto. Se um valor for um Varseu endereço type deve corresponder exatamente ao da variável que está substituindo.

  • inline_captures (bool) –

    se True, então todos os nós de identificadores "capturados" no other QuantumCircuit são considerados como referentes a identificadores já declarados em self (como qualquer tipo de entrada/captura/local), e os usos em other serão aplicados aos identificadores existentes. Se você quiser criar uma camada para um circuito existente a ser usado com compose()poderá achar útil o argumento vars_mode="captures" para copy_empty_like() útil. Qualquer remapeamento em vars_remap ocorre antes da avaliação dessa variável inlining.

    Se for False (o padrão), todos os identificadores em other deverão ser distintos daqueles em self, e novas declarações serão feitas para eles.

  • wrap (bool) – Se verdadeiro, envolve o outro circuito em uma porta (ou instrução, dependendo se ele contém apenas instruções unitárias) antes de compô-lo em si mesmo. Em vez de usar essa opção, quase sempre é melhor controlar isso manualmente usando to_instruction() ou to_gate()e, em seguida, chamar append().

Retorna

o circuito composto (retorna None se inplace==True).

Tipo de retorno

QuantumCircuit

Aumentos

  • CircuitError - se não for possível fazer o mapeamento correto dos fios entre os dois circuitos, por exemplo, se other for mais largo que self.
  • CircuitError - se tentar emitir um novo circuito enquanto self tiver um contexto de fluxo de controle parcialmente construído ativo, como as formas de gerenciador de contexto de if_test(), for_loop() e while_loop().
  • CircuitError - se estiver tentando compor a parte frontal de um circuito quando um bloco construtor de fluxo de controle estiver ativo; não há um significado claro para essa ação.

Exemplos

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

Se você estiver tentando unir dois circuitos, isso se aplicará a qubits e clbits completamente desconectados, tensor() é um invólucro conveniente para adicionar manualmente objetos de bits e chamar compose().

tensor

tensor(other, inplace=False)

GitHub

Tensor self com other.

Lembre-se de que, na convenção little-endian, a operação mais à esquerda estará na parte inferior do circuito. Consulte também os documentos para obter mais informações.

     ┌────────┐        ┌─────┐          ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├  = q_0: ─┤ top ├──
     └────────┘        └─────┘         ┌┴─────┴─┐
                                  q_1: ┤ bottom ├
                                       └────────┘

Parâmetros

  • other (QuantumCircuit) – O outro circuito com o qual esse circuito deve ser tensionado.
  • inplace (bool) – Se True, modifique o objeto. Caso contrário, retorne o circuito composto.

Tipo de retorno

QuantumCircuit | Nenhum

Exemplos

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 de circuito gerado pelo código anterior.

Retorna

O circuito tensionado (retorna None se inplace=True).

Tipo de retorno

QuantumCircuit

Parâmetros

Como algumas regras gerais:

Algumas armadilhas em potencial com as quais você deve tomar cuidado:

  • Mesmo que você reutilize um Instruction personalizado durante a construção do circuito, o transpilador geralmente terá que "desenrolar" cada invocação dele para sua decomposição interna antes de começar a trabalhar nele. Isso não deve impedi-lo de usar o to_instruction()-plus-append() pois o transpilador melhorará nesse aspecto com o tempo.
  • compose() produzirá, por padrão, um novo circuito para compatibilidade com versões anteriores. Isso é mais caro e, em geral, não é o que você deseja, portanto, você deve definir inplace=True.
  • Ambos append() e compose() (mas não _append()) têm um argumento de palavra-chave copy que tem como padrão True. Nesses casos, as instâncias de entrada Operation recebidas serão copiadas se o Qiskit detectar que os objetos têm mutabilidade (como a obtenção de parâmetros de porta). Se você tiver certeza de que não reutilizará os objetos em outros lugares, defina copy=False para evitar essa cópia, o que pode aumentar consideravelmente a velocidade de objetos grandes.

Métodos para adicionar instruções padrão

A QuantumCircuit classe possui métodos auxiliares para adicionar muitas das instruções e portas da biblioteca padrão do Qiskit a um circuito. Isso equivale, em geral, a criar manualmente uma instância do objeto qiskit.circuit.library em questão e, em seguida, passá-la para append() com os argumentos restantes inseridos nos campos qargs cargs e conforme apropriado.

Os métodos a seguir aplicam operações especiais não unitárias Instruction ao circuito:

Esses métodos aplicam instâncias unitárias não controladas Gate não controladas ao circuito:

Os seguintes métodos se aplicam Gate que também são portas controladas, portanto, são subclasses diretas de ControlledGate:

Por fim, esses métodos aplicam portas controladas multiplicadas generalizadas específicas ao circuito, muitas vezes com sínteses ansiosas. Eles são listados em termos da porta de base que estão controlando, uma vez que sua saída exata é frequentemente uma versão sintetizada de uma porta.

O restante desta seção é a listagem da API de todos os métodos individuais; as tabelas acima são resumos cujos links o levarão ao local correto.

barrier

barrier(*qargs, label=None)

GitHub

Inscreva-se em Barrier. Se qargs estiver vazio, aplica-se a todos os qubits do circuito.

Parâmetros

  • qargs (QubitSpecifier) – Especificação para um ou mais argumentos de qubit.
  • label (str) – O rótulo de cadeia de caracteres da barreira.

Retorna

para as instruções adicionais.

Tipo de retorno

qiskit.circuit.InstructionSet

ccx

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

GitHub

Aplicar CCXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

ccz

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

GitHub

Aplicar CCZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

ch

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

GitHub

Aplicar CHGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cp

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

GitHub

Aplicar CPhaseGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

crx

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

GitHub

Aplicar CRXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cry

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

GitHub

Aplicar CRYGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

crz

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

GitHub

Aplicar CRZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cs

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

GitHub

Aplicar CSGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

csdg

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

GitHub

Aplicar CSdgGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cswap

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

GitHub

Aplicar CSwapGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

csx

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

GitHub

Aplicar CSXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cu

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

GitHub

Aplicar CUGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cx

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

GitHub

Aplicar CXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cy

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

GitHub

Aplicar CYGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

cz

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

GitHub

Aplicar CZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

dcx

dcx(qubit1, qubit2)

GitHub

Aplicar DCXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

delay

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

GitHub

Aplicar Delay. Se qarg for None, aplica-se a todos os qubits. Ao aplicar a vários qubits, serão criados atrasos com a mesma duração.

Parâmetros

  • duration (Object) – duração do atraso. Se for um Exprele deve ser uma expressão constante do tipo Duration.
  • qarg (Object) – para aplicar esse atraso.
  • unit (str | None) – unidade da duração, a menos que duration seja um Expr caso em que ela não deve ser especificada. Unidades apoiadas: 's', 'ms', 'us', 'ns', 'ps', e 'dt'. O padrão é 'dt', ou seja, uma unidade de tempo inteira, dependendo do backend de destino.

Retorna

para as instruções adicionais.

Tipo de retorno

qiskit.circuit.InstructionSet

Aumentos

CircuitError - se os argumentos tiverem um formato ruim.

ecr

ecr(qubit1, qubit2)

GitHub

Aplicar ECRGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

h

h(qubit)

GitHub

Aplicar HGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

id

id(qubit)

GitHub

Aplicar IGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

initialize

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

GitHub

Inicializar os qubits em um estado específico.

A inicialização do Qubit é feita primeiro redefinindo os qubits para 0|0\rangle e, em seguida, chamando a StatePreparation para preparar os qubits em um estado especificado. Essas duas etapas estão incluídas nas Initialize instrução.

Parâmetros

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

    O estado a ser inicializado pode ser um dos seguintes.

    • Vetor de estado ou vetor de amplitudes complexas para inicializar.
    • Rótulos dos estados da base dos estados próprios de Pauli Z, X, Y. Consulte Statevector.from_label(). Observe que a ordem dos rótulos é invertida com relação ao índice do qubit a ser aplicado. Exemplo de rótulo '01' inicializa o qubit zero em 1|1\rangle e o qubit um em 0|0\rangle.
    • Um número inteiro que é usado como um mapa de bits indicando quais qubits devem ser inicializados em 1|1\rangle. Exemplo: definir params como 5 inicializaria o qubit 0 e o qubit 2 em 1|1\rangle e o qubit 1 em 0|0\rangle.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits para inicializar. Se None , a inicialização será aplicada a todos os qubits do circuito.

  • normalize (bool) – Se deve normalizar uma matriz de entrada em um vetor unitário.

Retorna

Um identificador para as instruções criadas.

Exemplos

Prepare um qubit no estado (01)/2(|0\rangle - |1\rangle) / \sqrt{2}.

import numpy as np
from qiskit import QuantumCircuit

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

saída:

     ┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
     └──────────────────────────────┘

Inicialize a partir de uma string dois qubits no estado 10|10\rangle. A ordem dos rótulos é invertida com relação ao índice do qubit. Mais informações sobre os rótulos dos estados da base estão em Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

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

saída:

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

Inicialize dois qubits a partir de uma matriz de amplitudes complexas.

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

saída:

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

iswap

iswap(qubit1, qubit2)

GitHub

Aplicar iSwapGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

mcp

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

GitHub

Aplicar MCPhaseGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

mcrx

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

GitHub

Aplicar a porta de rotação X com controle múltiplo

Parâmetros

mcry

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

GitHub

Aplicar a porta de rotação Y com controle múltiplo

Parâmetros

mcrz

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

GitHub

Aplicar a porta de rotação Z com controle múltiplo

Parâmetros

mcx

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

GitHub

Aplicar MCXGate.

A porta multi-cX pode ser implementada por meio de diferentes técnicas, que usam diferentes números de qubits de ancilla e têm profundidade de circuito variável. Esses modos são:

  • 'noancilla': Requer 0 qubits de ancilla.
  • 'recursion': Requer 1 qubit de ancilla se mais de 4 controles forem usados; caso contrário, 0.
  • 'v-chain': Requer 2 ancillas a menos do que o número de qubits de controle.
  • 'v-chain-dirty': O mesmo que para os ancillas limpos (mas o circuito será mais longo).

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Descontinuado desde a versão 2.1

qiskit.circuit.quantumcircuit.QuantumCircuit.mcx()o argumento mode está obsoleto desde o Qiskit 2.1. Ele não será removido antes de 3 meses após a data de lançamento. Em vez disso, adicione um MCXGate genérico ao circuito e especifique o método de síntese por meio do site hls_config na transpilação. Como alternativa, decomposições específicas estão disponíveis em https://qisk.it/mcx.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Aumentos

  • ValueError - se o modo fornecido não for conhecido ou se forem passados muito poucos qubits de ancilla.
  • AttributeError - se nenhum qubits ancilla for passado, mas alguns forem necessários.

Tipo de retorno

InstructionSet

measure

measure(qubit, cbit)

GitHub

Meça um bit quântico (qubit) na base Z em um bit clássico (cbit).

Quando um estado quântico é medido, um qubit é projetado na base computacional (Pauli Z) para 0\lvert 0 \rangle ou 1\lvert 1 \rangle. O bit clássico cbit indica o resultado dessa projeção como 0 ou 1 , respectivamente. Essa operação não é reversível.

Parâmetros

Retorna

para as instruções adicionais.

Tipo de retorno

qiskit.circuit.InstructionSet

Aumentos

CircuitError - se os argumentos tiverem um formato ruim.

Exemplos

Nesse exemplo, um qubit é medido e o resultado dessa medição é armazenado no bit clássico (geralmente expresso em diagramas como uma linha dupla):

from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw()
     ┌───┐┌─┐
  q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0

É possível chamar measure com listas de qubits e cbits como um atalho para a medição um a um. Essas duas formas produzem 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)

Em vez de listas, você pode usar QuantumRegister e ClassicalRegister com a mesma lógica.

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)

Isso é equivalente a:

circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])

ms

ms(theta, qubits)

GitHub

Aplicar MSGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

p

p(theta, qubit)

GitHub

Aplicar PhaseGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

pauli

pauli(pauli_string, qubits)

GitHub

Aplicar PauliGate.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

prepare_state

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

GitHub

Preparar qubits em um estado específico.

Essa classe implementa uma unidade de preparação de estado. Diferente de initialize() ele não redefine os qubits primeiro.

Parâmetros

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

    O estado a ser inicializado pode ser um dos seguintes.

    • Vetor de estado ou vetor de amplitudes complexas para inicializar.
    • Rótulos dos estados da base dos estados próprios de Pauli Z, X, Y. Consulte Statevector.from_label(). Observe que a ordem dos rótulos é invertida com relação ao índice do qubit a ser aplicado. O rótulo de exemplo '01' inicializa o qubit zero em 1|1\rangle e o qubit um em 0|0\rangle.
    • Um número inteiro que é usado como um mapa de bits indicando quais qubits devem ser inicializados em 1|1\rangle. Exemplo: definir params como 5 inicializaria o qubit 0 e o qubit 2 em 1|1\rangle e o qubit 1 em 0|0\rangle.
  • qubits (Sequence[QubitSpecifier] | None) – Qubits para inicializar. Se None , a inicialização será aplicada a todos os qubits do circuito.

  • label (str | None) – Uma etiqueta opcional para o portão

  • normalize (bool) – Se deve normalizar uma matriz de entrada em um vetor unitário.

Retorna

Um identificador da instrução que acabou de ser inicializada

Tipo de retorno

InstructionSet

Exemplos

Prepare um qubit no estado (01)/2(|0\rangle - |1\rangle) / \sqrt{2}.

import numpy as np
from qiskit import QuantumCircuit

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

saída:

     ┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
     └─────────────────────────────────────┘

Prepare a partir de uma cadeia dois qubits no estado 10|10\rangle. A ordem dos rótulos é invertida com relação ao índice do qubit. Mais informações sobre os rótulos dos estados da base estão em Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

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

saída:

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

Inicialize dois qubits a partir de uma matriz de amplitudes complexas

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

saída:

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

r

r(theta, phi, qubit)

GitHub

Aplicar RGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rcccx

rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)

GitHub

Aplicar RC3XGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rccx

rccx(control_qubit1, control_qubit2, target_qubit)

GitHub

Aplicar RCCXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

reset

reset(qubit)

GitHub

Redefina o(s) bit(s) quântico(s) para seu estado padrão.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit(s) a serem reinicializados.

Retorna

para a instrução adicionada.

Tipo de retorno

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit)

GitHub

Aplicar RVGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Rotação em torno de um eixo de rotação arbitrário vv, em que v|v| é o ângulo de rotação em radianos.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rx

rx(theta, qubit, label=None)

GitHub

Aplicar RXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rxx

rxx(theta, qubit1, qubit2)

GitHub

Aplicar RXXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

ry

ry(theta, qubit, label=None)

GitHub

Aplicar RYGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

ryy

ryy(theta, qubit1, qubit2)

GitHub

Aplicar RYYGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rz

rz(phi, qubit)

GitHub

Aplicar RZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rzx

rzx(theta, qubit1, qubit2)

GitHub

Aplicar RZXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

rzz

rzz(theta, qubit1, qubit2)

GitHub

Aplicar RZZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

s

s(qubit)

GitHub

Aplicar SGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

sdg

sdg(qubit)

GitHub

Aplicar SdgGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

store

store(lvalue, rvalue, /)

GitHub

Armazene o resultado da expressão clássica em tempo real rvalue no local da memória definido por lvalue.

Normalmente, lvalue será um nó Var e rvalue será um nó Expr para escrever nele, mas qualquer coisa que expr.lift() possa ser elevado a um Expr é permitido em ambos os locais, e será chamado neles.

Parâmetros

  • lvalue (Any) – um especificador válido para um local de memória no circuito. Normalmente, esse será um nó Var mas você também pode escrever em Clbit ou ClassicalRegister locais de memória se o hardware for compatível. O local da memória já deve estar presente no circuito.
  • rvalue (Any) – uma expressão clássica em tempo real cujo resultado deve ser gravado no local de memória fornecido.

Tipo de retorno

InstructionSet

Veja Também

Store

A classe de apoio Instruction que representa essa operação.

add_var()

Crie uma nova variável no circuito que possa ser gravada com esse método.

swap

swap(qubit1, qubit2)

GitHub

Aplicar SwapGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

sx

sx(qubit)

GitHub

Aplicar SXGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

sxdg

sxdg(qubit)

GitHub

Aplicar SXdgGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

t

t(qubit)

GitHub

Aplicar TGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

tdg

tdg(qubit)

GitHub

Aplicar TdgGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

u

u(theta, phi, lam, qubit)

GitHub

Aplicar UGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

unitary

unitary(obj, qubits, label=None)

GitHub

Aplique a porta unitária especificada por obj em qubits.

Parâmetros

  • obj (np.ndarray | Gate | BaseOperator) – Operador unitário.
  • qubits (Sequence[QubitSpecifier]) – Os qubits do circuito aos quais aplicar a transformação.
  • label (str | None) – Nome unitário para o backend [Padrão: Nenhum].

Retorna

O circuito quântico.

Tipo de retorno

QuantumCircuit

Exemplo

Aplicar uma porta especificada por uma matriz unitária a um circuito quâ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

Aplicar XGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

y

y(qubit)

GitHub

Aplicar YGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

z

z(qubit)

GitHub

Aplicar ZGate.

Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.

Parâmetros

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.

Retorna

Um identificador para as instruções criadas.

Tipo de retorno

InstructionSet

Adicionando fluxo de controle aos circuitos

Veja Também

Fluxo de controle em circuitos

Discussão de como as operações de fluxo de controle são representadas em todo o qiskit.circuit contexto.

QuantumCircuit possui métodos correspondentes para todas as operações de fluxo de controle suportadas pelo Qiskit. Existem duas formas de chamá-los. O primeiro é um wrapper de conveniência muito simples que recebe os corpos dos blocos das instruções como QuantumCircuit argumentos e simplesmente constrói e anexa o correspondente ControlFlowOp.

A segunda forma, que recomendamos enfaticamente que você use para construir o fluxo de controle, é chamada de interface do construtor. Aqui, os métodos usam apenas o discriminante em tempo real da operação e retornam gerentes de contexto que você insere usando with. Em seguida, você pode usar métodos QuantumCircuit dentro desses blocos para construir os corpos do fluxo de controle, e o Qiskit rastreará automaticamente quais recursos de dados são necessários para os blocos internos, construindo o ControlFlowOp completo quando você sair da instrução with . É muito mais simples e menos propenso a erros criar o fluxo de controle programaticamente dessa forma.

Ao usar a interface do construtor de fluxo de controle, às vezes você pode querer que um qubit seja incluído em um bloco, mesmo que ele não tenha operações definidas. Nesse caso, você pode usar o método noop() método.

Para verificar se um circuito contém um ControlFlowOp você pode usar o método auxiliar QuantumCircuit.has_control_flow_op().

box

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

GitHub

Crie um box de operações nesse circuito que são tratadas atomicamente no contexto maior.

Uma "caixa" é uma construção de fluxo de controle que é inserida incondicionalmente. O conteúdo da caixa se comporta de certa forma como se o início e o fim da caixa fossem barreiras (consulte barrier()), exceto pelo fato de que é permitido comutar operações "até o fim" da caixa. A caixa também é um escopo explícito para fins de variáveis, trechos e passagens do compilador.

Há duas formas de chamar essa função:

  • Passe um QuantumCircuit posicionalmente, e os sites qubits e clbits em que ele atua. Nesse formato, um BoxOp é imediatamente criado e anexado usando o circuito como corpo.
  • Use em uma declaração with sem body, qubits ou clbits. Esse é o "formulário de interface do construtor", no qual você usa outros QuantumCircuit métodos no escopo Python with para adicionar instruções ao box. Essa é a forma preferida e muito menos propensa a erros.

Exemplos

Usar a interface do construtor para adicionar duas caixas em sequência. As duas caixas desse circuito podem ser executadas simultaneamente, e a segunda insere explicitamente uma dependência de fluxo de dados no qubit 8 durante a duração da caixa, mesmo que o qubit esteja ocioso.

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)

Usando a construção explícita da caixa. Isso cria o mesmo circuito acima e deve indicar por que o formulário anterior é preferível para uso interativo.

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]) – o primeiro argumento posicional não tem nome. Se um QuantumCircuit for passado de forma posicional, ele será imediatamente usado como o corpo da caixa, e qubits e clbits também deverão ser especificados. Se não for fornecido, ou se for fornecido um iterável de objetos Annotation o formulário do gerenciador de contexto desse método será acionado.
  • qubits (Sequence[QubitSpecifier] | None) – os qubits aos quais aplicar o BoxOp na forma explícita.
  • clbits (Sequence[ClbitSpecifier] | None) – os clbits aos quais aplicar o BoxOp , na forma explícita.
  • label (str | None) – um rótulo de cadeia de caracteres opcional para a instrução.
  • duration (None) – uma duração explícita opcional para o BoxOp. As passagens de programação são limitadas para programar o escopo contido para corresponder a uma determinada duração, incluindo a inserção de atrasos, se necessário.
  • unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – a unidade do site duration.
  • annotations (Iterable[Annotation]) – qualquer Annotation objetos que a caixa deve ter. Quando esse método é usado na forma de gerenciador de contexto, esse argumento pode ser passado como o único argumento posicional.

break_loop

break_loop()

GitHub

Aplicar BreakLoopOp.

Aviso

Se você estiver usando os formulários "builder" do gerenciador de contexto de if_test(), for_loop() ou while_loop()você só poderá chamar esse método se estiver em um contexto de loop, pois, caso contrário, a "largura do recurso" da operação não poderá ser determinada. Isso levaria rapidamente a circuitos inválidos e, portanto, se você estiver tentando construir um corpo de loop reutilizável (sem os gerenciadores de contexto), também deverá usar a forma sem gerenciador de contexto de if_test() e if_else(). Tome cuidado para que a instrução BreakLoopOp deve abranger todos os recursos do loop que a contém, e não apenas o escopo imediato.

Retorna

Um identificador para a instrução criada.

Aumentos

CircuitError - se esse método tiver sido chamado em um contexto de construtor, mas não estiver contido em um loop.

Tipo de retorno

InstructionSet

continue_loop

continue_loop()

GitHub

Aplicar ContinueLoopOp.

Aviso

Se você estiver usando os formulários "builder" do gerenciador de contexto de if_test(), for_loop() ou while_loop()você só poderá chamar esse método se estiver em um contexto de loop, pois, caso contrário, a "largura do recurso" da operação não poderá ser determinada. Isso levaria rapidamente a circuitos inválidos e, portanto, se você estiver tentando construir um corpo de loop reutilizável (sem os gerenciadores de contexto), também deverá usar a forma sem gerenciador de contexto de if_test() e if_else(). Tome cuidado para que a instrução ContinueLoopOp deve abranger todos os recursos do loop que a contém, e não apenas o escopo imediato.

Retorna

Um identificador para a instrução criada.

Aumentos

CircuitError - se esse método tiver sido chamado em um contexto de construtor, mas não estiver contido em um loop.

Tipo de retorno

InstructionSet

for_loop

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

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

GitHub

Crie um loop for nesse circuito.

Há duas formas de chamar essa função. Se for chamado com todos os seus argumentos (com a possível exceção de label), ele criará um ForLoopOp com o endereço body. Se body (e qubits e clbits) não forem passados, isso funcionará como um gerenciador de contexto que, quando inserido, fornece uma variável de loop (a menos que uma seja fornecida, caso em que será reutilizada) e criará automaticamente um ForLoopOp quando o escopo terminar. Nessa forma, não é necessário controlar os qubits ou clbits que você está usando, pois o escopo cuidará disso para você.

Por exemplo:

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]) – Uma coleção de números inteiros para fazer o loop. Sempre necessário.

  • loop_parameter (Optional[Parameter]) –

    O parâmetro usado em body ao qual os valores de indexset serão atribuídos. No formulário do gerenciador de contexto, se esse argumento não for fornecido, um parâmetro de loop será alocado para você e retornado como o valor da instrução with . Ele só será ligado ao circuito se for usado dentro do corpo.

    Se esse argumento for None na forma manual desse método, body será repetido uma vez para cada um dos itens em indexset , mas seus valores serão ignorados.

  • body (Optional[QuantumCircuit]) – O corpo do loop a ser executado repetidamente. Omita isso para usar o modo de gerenciador de contexto.

  • qubits (Optional[Sequence[QubitSpecifier]]) – Os qubits do circuito sobre os quais o corpo do loop deve ser executado. Omita isso para usar o modo de gerenciador de contexto.

  • clbits (Optional[Sequence[ClbitSpecifier]]) – Os clbits de circuito sobre os quais o corpo do loop deve ser executado. Omita isso para usar o modo de gerenciador de contexto.

  • label (Optional[str]) – O rótulo da cadeia de caracteres da instrução no circuito.

Retorna

dependendo da assinatura da chamada, um gerenciador de contexto para criar o loop for (ele será automaticamente adicionado ao circuito no final do bloco) ou um InstructionSet para a operação de loop anexada.

Tipo de retorno

InstructionSet ou ForLoopContext

Aumentos

CircuitError - se for usada uma convenção de chamada incorreta.

if_else

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

GitHub

Aplicar IfElseOp.

Nota

Esse método não tem um formulário de gerenciador de contexto associado, porque ele já é tratado pelo método if_test() método. Você pode usar a parte else dessa frase com algo como:

from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((bits[2], 0)) as else_:
    qc.h(0)
with else_:
    qc.x(0)

Parâmetros

  • condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool]) – Uma condição a ser avaliada em tempo real durante a execução do circuito, que, se for verdadeira, acionará a avaliação de true_body. Pode ser especificado como uma tupla de um ClassicalRegister a ser testado quanto à igualdade com um determinado int, ou como uma tupla de um Clbit a ser comparado com um bool ou um int.
  • true_body (QuantumCircuit) – O corpo do circuito a ser executado se condition for verdadeiro.
  • false_body (QuantumCircuit) – O circuito a ser executado se condition for falso.
  • qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits do circuito sobre os quais a condição if/else deve ser executada.
  • clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – Os bits do circuito sobre os quais a condição if/else deve ser executada.
  • label (str | None) – O rótulo da cadeia de caracteres da instrução no circuito.

Aumentos

CircuitError - Se a condição fornecida fizer referência a Clbits fora do circuito de fechamento.

Retorna

Um identificador para a instrução criada.

Tipo de retorno

InstructionSet

if_test

if_test(condition: tuple[ClassicalRegister | Clbit, int]) → IfContext

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

GitHub

Crie uma declaração if sobre esse circuito.

Há duas formas de chamar essa função. Se for chamado com todos os seus argumentos (com a possível exceção de label), ele criará um IfElseOp com o true_body fornecido, e não haverá ramificação para a condição false (consulte também o método if_else() ). No entanto, se true_body (e qubits e clbits) não forem passados, isso funcionará como um gerenciador de contexto, que pode ser usado para criar declarações if . O valor de retorno da instrução with é um gerenciador de contexto encadeável, que pode ser usado para criar blocos else subsequentes. Nessa forma, não é necessário controlar os qubits ou clbits que você está usando, pois o escopo cuidará disso para você.

Por exemplo:

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

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

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

Parâmetros

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Uma condição a ser avaliada em tempo real durante a execução do circuito, que, se verdadeira, acionará a avaliação de true_body. Pode ser especificado como uma tupla de ClassicalRegister a ser testada para igualdade com um determinado int, ou como uma tupla de Clbit a ser comparada com um bool ou um int.
  • true_body (Optional[QuantumCircuit]) – O corpo do circuito a ser executado se condition for verdadeiro.
  • qubits (Optional[Sequence[QubitSpecifier]]) – Os qubits do circuito sobre os quais o if/else deve ser executado.
  • clbits (Optional[Sequence[ClbitSpecifier]]) – Os clbits de circuito sobre os quais o if/else deve ser executado.
  • label (Optional[str]) – O rótulo da cadeia de caracteres da instrução no circuito.

Retorna

dependendo da assinatura da chamada, um gerenciador de contexto para criar o bloco if (ele será automaticamente adicionado ao circuito no final do bloco) ou um InstructionSet para a operação condicional anexada.

Tipo de retorno

InstructionSet ou IfContext

Aumentos

  • CircuitError - Se a condição fornecida fizer referência a Clbits fora do circuito de fechamento.
  • CircuitError - se for usada uma convenção de chamada incorreta.

Retorna

Um identificador para a instrução criada.

switch

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

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

GitHub

Crie uma estrutura switch/case nesse circuito.

Há duas formas de chamar essa função. Se for chamado com todos os seus argumentos (com a possível exceção de label), ele criará um SwitchCaseOp com a estrutura de caso fornecida. Se cases (e qubits e clbits) não forem passados, ele atuará como um gerenciador de contexto, que criará automaticamente um SwitchCaseOp quando o escopo for concluído. Nessa forma, não é necessário controlar os qubits ou clbits que você está usando, pois o escopo cuidará disso para você.

Exemplo de uso:

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

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

Parâmetros

  • target (Union[ClassicalRegister, Clbit]) – O valor clássico para trocar um. Deve ser do tipo inteiro.
  • cases (Iterable[Tuple[Any, QuantumCircuit]]) – Uma sequência de especificadores de caso. Cada tupla define um corpo de caso (o segundo item). O primeiro item da tupla pode ser um único valor inteiro, o valor especial CASE_DEFAULTou uma tupla de vários valores inteiros. Cada um dos valores inteiros será tentado sucessivamente; o controle passará então para o corpo correspondente à primeira correspondência. CASE_DEFAULT corresponde a todos os valores possíveis. Omitir no formulário do gerenciador de contexto.
  • qubits (Sequence[Qubit]) – Os qubits do circuito sobre os quais todos os corpos de caso são executados. Omitir no formulário do gerenciador de contexto.
  • clbits (Sequence[Clbit]) – Os clbits de circuito sobre os quais todos os corpos de caso são executados. Omitir no formulário do gerenciador de contexto.
  • label (Optional[str]) – O rótulo da cadeia de caracteres da instrução no circuito.

Retorna

Se for usado no modo de gerenciador de contexto, deverá ser usado como um recurso with , que retornará um objeto que pode ser inserido repetidamente para produzir casos para a instrução switch. Se o formulário completo for usado, isso retornará um identificador para as instruções criadas.

Tipo de retorno

InstructionSet ou SwitchCaseContext

Aumentos

CircuitError - se for usada uma convenção de chamada incorreta.

while_loop

while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: None, qubits: None, clbits: None, *, label: str | 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) → InstructionSet

GitHub

Crie um loop while nesse circuito.

Há duas formas de chamar essa função. Se for chamado com todos os seus argumentos (com a possível exceção de label), ele criará um WhileLoopOp com o body fornecido. Se body (e qubits e clbits) não forem passados, ele atuará como um gerenciador de contexto, que criará automaticamente um WhileLoopOp quando o escopo terminar. Nesse formato, não é necessário controlar os qubits ou clbits que você está usando, pois o escopo cuidará disso para você.

Exemplo de uso:

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

with qc.while_loop((bits[2], 0)):
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)

Parâmetros

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – Uma condição de igualdade a ser verificada antes da execução de body. O lado esquerdo da condição deve ser um ClassicalRegister ou a Clbite o lado direito deve ser um número inteiro ou booleano.
  • body (Optional[QuantumCircuit]) – O corpo do loop a ser executado repetidamente. Omita isso para usar o modo de gerenciador de contexto.
  • qubits (Optional[Sequence[Qubit]]) – Os qubits do circuito sobre os quais o corpo do loop deve ser executado. Omita isso para usar o modo de gerenciador de contexto.
  • clbits (Optional[Sequence[Clbit]]) – Os clbits de circuito sobre os quais o corpo do loop deve ser executado. Omita isso para usar o modo de gerenciador de contexto.
  • label (Optional[str]) – O rótulo da cadeia de caracteres da instrução no circuito.

Retorna

Se for usado no modo de gerenciador de contexto, deverá ser usado como um recurso with , que inferirá o conteúdo do bloco e os operandos na saída. Se o formulário completo for usado, isso retornará um identificador para as instruções criadas.

Tipo de retorno

InstructionSet ou WhileLoopContext

Aumentos

CircuitError - se for usada uma convenção de chamada incorreta.

noop

noop(*qargs)

GitHub

Marca o(s) qubit(s) fornecido(s) como usado(s) no escopo atual, sem adicionar uma operação.

Isso não tem efeito (além de gerar uma exceção em caso de entrada inválida) quando chamado no escopo superior de um arquivo QuantumCircuit. Dentro de um construtor de fluxo de controle, isso faz com que o qubit seja "usado" pelo bloco de fluxo de controle, se ainda não estiver sendo usado, sem acrescentar nenhuma operação adicional a ele.

Por exemplo:

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ável de especificadores de qubit válidos. Qualquer coisa que possa ser passada como um qubit ou um conjunto de qubits é válida para cada argumento aqui.

Aumentos

CircuitError - se algum qubit solicitado não for válido para o circuito.

has_control_flow_op

has_control_flow_op()

GitHub

Verifica se o circuito tem uma instância de ControlFlowOp presente em suas operações.

Tipo de retorno

bool

Conversão de circuitos em outros objetos

Conforme discutido em Métodos para adicionar operações gerais, você pode converter um circuito em um Instruction ou um Gate usando dois métodos auxiliares.

to_instruction

to_instruction(parameter_map=None, label=None)

GitHub

Crie um Instruction a partir desse circuito.

Veja Também

circuit_to_instruction()

O driver subjacente desse método.

Parâmetros

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – Para circuitos parametrizados, um mapeamento dos parâmetros do circuito para os parâmetros a serem utilizados na instrução. Se for “Nenhum”, os parâmetros do circuito existentes também definirão os parâmetros da instrução.
  • label (str | None) – Etiqueta de portão opcional.

Retorna

uma instrução composta que encapsula esse circuito (pode ser

decomposto).

Tipo de retorno

qiskit.circuit.Instruction

to_gate

to_gate(parameter_map=None, label=None)

GitHub

Crie um Gate a partir desse circuito. O circuito deve atuar somente em qubits e conter somente operações unitárias.

Veja Também

circuit_to_gate()

O driver subjacente desse método.

Parâmetros

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – Para circuitos parametrizados, um mapeamento dos parâmetros do circuito para os parâmetros a serem utilizados na porta lógica. Nesse caso None, os parâmetros do circuito existente também definirão a porta.
  • label (str | None) – Etiqueta de portão opcional.

Retorna

uma porta composta que encapsula esse circuito (pode ser decomposta novamente).

Tipo de retorno

Entrada

Além disso, você pode converter todo o circuito na DAGCircuit representação:

to_dag

to_dag(*, copy_operations=True)

GitHub

Converta este circuito para um DAGCircuit.

Este é um simples invólucro em torno de circuit_to_dag().

Parâmetros

copy_operations (bool) – se deve copiar profundamente as instruções individuais. Se definido como False, a operação é mais barata, mas as mutações nas instruções no DAG afetarão o circuito original.

Retorna

um DAG representando esse mesmo circuito.

Tipo de retorno

qiskit.dagcircuit.DAGCircuit

Métodos de mutação auxiliar

Há dois métodos de nível superior em QuantumCircuit para anexar medições ao final de um circuito. Observe que, por padrão, eles também adicionam um registro extra.

measure_active

measure_active(inplace=True)

GitHub

Adiciona medição a todos os qubits não ociosos. Cria um novo ClassicalRegister com um tamanho igual ao número de qubits não ociosos que estão sendo medidos.

Retorna um novo circuito com medições se inplace=False.

Parâmetros

inplace (bool) – Todas as medições no local ou retorno do novo circuito.

Retorna

Retorna o circuito com medições quando inplace = False.

Tipo de retorno

QuantumCircuit

measure_all

measure_all(inplace=True, add_bits=True)

GitHub

Adiciona medição a todos os qubits.

Por padrão, adiciona novos bits clássicos em um ClassicalRegister para armazenar essas medições. Se for add_bits=False, os resultados das medições serão armazenados nos bits clássicos já existentes, com o qubit n sendo medido no bit clássico n.

Retorna um novo circuito com medições se inplace=False.

Parâmetros

  • inplace (bool) – Todas as medições no local ou retorno do novo circuito.
  • add_bits (bool) – Se deve adicionar novos bits para armazenar os resultados.

Retorna

Retorna o circuito com medições quando inplace=False.

Tipo de retorno

QuantumCircuit

Aumentos

CircuitError - se add_bits=False , mas não há bits clássicos suficientes.

Há dois métodos "subtrativos" em QuantumCircuit também. Esse não é um caso de uso para o qual o QuantumCircuit foi projetado; normalmente, você deve procurar usar copy_empty_like() no lugar de clear()e executar remove_final_measurements() como sua forma de passagem de transpilador RemoveFinalMeasurements.

clear

clear()

GitHub

Limpar todas as instruções em si mesmo.

A limpeza dos circuitos manterá os metadados.

Veja Também

copy_empty_like()

Um método para produzir um novo circuito sem instruções e com o mesmo rastreamento de dados digitados quânticos e clássicos, mas sem alterar o circuito original.

Tipo de retorno

Nenhum

remove_final_measurements

remove_final_measurements(inplace=True)

GitHub

Remove as medições finais e as barreiras em todos os qubits, se estiverem presentes. Exclui os registros clássicos que foram usados para armazenar os valores dessas medições que se tornaram ociosos como resultado dessa operação e exclui os bits clássicos que são referenciados apenas por registros removidos ou que não são referenciados, mas que se tornaram ociosos como resultado dessa operação.

As medições e barreiras são consideradas finais se não forem seguidas por nenhuma outra operação (além de outras medições ou barreiras)

Nota

Esse método tem um comportamento bastante complexo, principalmente em relação à remoção de bits e registros clássicos recém-ocupados. É muito mais eficiente evitar adicionar dados clássicos desnecessários em primeiro lugar, em vez de tentar removê-los posteriormente.

Veja Também

RemoveFinalMeasurements

Um passe de transpilador que remove as medidas e barreiras finais. Isso não remove os dados clássicos. Se esse for seu objetivo, você pode chamá-lo com:

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 as medições são removidas no local ou devolvem um novo circuito.

Retorna

Retorna o circuito resultante quando inplace=False, caso contrário, None.

Tipo de retorno

QuantumCircuit


Propriedades do circuito

Métricas simples do circuito

Ao construir circuitos quânticos, há várias propriedades que ajudam a quantificar o "tamanho" dos circuitos e sua capacidade de serem executados em um dispositivo quântico com ruído. Alguns deles, como o número de qubits, são fáceis de entender, enquanto outros, como a profundidade e o número de componentes do tensor, exigem um pouco mais de explicação. Aqui, explicaremos todas essas propriedades e, como preparação para entender como os circuitos mudam quando executados em dispositivos reais, destacaremos as condições sob as quais eles mudam.

Considere o seguinte 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 de circuito gerado pelo código anterior.

Pelo gráfico, é fácil ver que esse circuito tem 12 qubits e uma coleção de portas Hadamard, CNOT, X e SWAP. Mas como quantificar isso de forma programática? Como podemos fazer portas de um único qubit em todos os qubits simultaneamente, o número de qubits nesse circuito é igual ao width() do circuito:

assert qc.width() == 12

Também podemos simplesmente obter o número de qubits diretamente usando num_qubits:

assert qc.num_qubits == 12
Importante

Para um circuito quântico composto apenas de qubits, a largura do circuito é igual ao número de qubits. Essa é a definição usada na computação quântica. No entanto, para circuitos mais complicados com registradores clássicos e portas controladas classicamente, essa equivalência não funciona. Dessa forma, a partir de agora, não nos referiremos ao número de qubits em um circuito quântico como a largura.

Também é fácil obter o número e o tipo de portas em um circuito usando count_ops():

qc.count_ops()
OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])

Também podemos obter apenas a contagem bruta de operações calculando os circuitos size():

assert qc.size() == 19

count_ops

count_ops()

GitHub

Conte cada tipo de operação no circuito.

Retorna

Uma discriminação do número de operações de cada tipo, ordenadas por valor.

Tipo de retorno

OrderedDict [ str, int ]

depth

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

GitHub

Profundidade do circuito de retorno (ou seja, comprimento do caminho crítico).

A profundidade de um circuito quântico é uma medida de quantas "camadas" de portas quânticas, executadas em paralelo, são necessárias para concluir a computação definida pelo circuito. Como as portas quânticas levam tempo para serem implementadas, a profundidade de um circuito corresponde aproximadamente à quantidade de tempo que o computador quântico leva para executar o circuito.

Aviso

Essa operação não será bem definida se o circuito contiver operações de fluxo de controle.

Parâmetros

filter_function (Callable[[CircuitInstruction], bool]) – Uma função para determinar quais instruções são consideradas para aumentar a profundidade. Deve receber como entrada posicional única um CircuitInstruction. As instruções para as quais a função retorna False são ignoradas no cálculo da profundidade do circuito. Por padrão, exclui “diretivas”, como Barrier.

Retorna

Profundidade do circuito.

Tipo de retorno

int

Exemplos

Cálculo simples da profundidade total do 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

Modificação do exemplo anterior para calcular apenas a profundidade de portas de vários qubits:

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

get_instructions

get_instructions(name)

GitHub

Obter instruções que correspondam ao nome.

Parâmetros

name (str) – O nome da instrução a ser obtida.

Retorna

lista de (instrução, qargs, cargs).

Tipo de retorno

list (tuple )

num_connected_components

num_connected_components(unitary_only=False)

GitHub

Em quantos subcircuitos não emaranhados o circuito pode ser fatorado.

Parâmetros

unitary_only (bool) – Calcular apenas a parte unitária do gráfico.

Retorna

Número de componentes conectados no circuito.

Tipo de retorno

int

num_nonlocal_gates

num_nonlocal_gates()

GitHub

Retorna o número de portas não locais (ou seja, envolvendo 2+ qubits).

Portas condicionais não locais também estão incluídas.

Tipo de retorno

int

num_tensor_factors

num_tensor_factors()

GitHub

Calcula o número de fatores tensoriais somente na parte unitária (quântica) do circuito.

Notas

Isso está aqui para compatibilidade com versões anteriores e será removido em uma versão futura do Qiskit. Em vez disso, você deve chamar num_unitary_factors.

Tipo de retorno

int

num_unitary_factors

num_unitary_factors()

GitHub

Calcula o número de fatores tensoriais somente na parte unitária (quântica) do circuito.

Tipo de retorno

int

size

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

GitHub

Retorna o número total de instruções no circuito.

Parâmetros

filter_function (callable) – uma função para filtrar algumas instruções. Deve receber como entrada uma tupla de (Instruction, list(Qubit), list(Clbit)). Por padrão, filtra "diretivas", como barreira ou snapshot.

Retorna

Número total de operações de portão.

Tipo de retorno

int

width

width()

GitHub

Retorna o número de qubits mais clbits no circuito.

Retorna

Largura do circuito.

Tipo de retorno

int

Acessando informações de programação

Se um QuantumCircuit tiver sido programado como parte de um pipeline de transpilação, as informações de tempo para qubits individuais poderão ser acessadas. As informações de tempo do circuito inteiro estão disponíveis por meio do estimate_duration() método e op_start_times atributo.

estimate_duration

estimate_duration(target, unit='s')

GitHub

Estimar a duração de um circuito programado

Esse método calcula a estimativa da duração do circuito encontrando o caminho de maior duração no circuito com base nas durações fornecidas por um determinado alvo. Esse método só funciona para circuitos simples que não têm fluxo de controle ou outras operações clássicas de avanço.

Parâmetros

  • target (Target) – A instância Target que contém durações para as instruções, se o alvo estiver faltando dados de duração para qualquer uma das instruções no circuito, uma mensagem QiskitError será gerado. Esse deve ser o mesmo objeto de destino usado como destino para a transpilação.
  • unit (str) – A unidade para retornar a duração em. O padrão é "s" para segundos, mas esse pode ser um prefixo SI compatível para retornos de segundos. Por exemplo, definir isso como "n" retornará na unidade de nanossegundos. Os valores compatíveis com esse tipo são "f", "p", "n", "u", "µ", "m", "k", "M", "G", "T" e "P". Além disso, um valor de "dt" também é aceito para gerar um número inteiro em unidades de "dt". Para que isso funcione, "dt" deve ser especificado no site target.

Retorna

A duração estimada para a execução de uma única tomada do circuito na unidade especificada.

Aumentos

QiskitError - Se o circuito não estiver programado ou contiver outros detalhes que impeçam o cálculo de uma duração estimada (como atraso parametrizado).

Tipo de retorno

int | float

qubit_duration

qubit_duration(*qubits)

GitHub

Retorna a duração entre o tempo de início e de parada da primeira e da última instrução, excluindo atrasos, nos qubits fornecidos. Sua unidade de tempo é self.unit.

Parâmetros

*qubits ( Qubit | int ) – Qubits dentro self para incluir.

Retorna

Retorna a duração entre a primeira hora de início e a última hora de parada de instruções sem atraso

Tipo de retorno

Valor flutuante

qubit_start_time

qubit_start_time(*qubits)

GitHub

Retorna a hora de início da primeira instrução, excluindo atrasos, nos qubits fornecidos. Sua unidade de tempo é self.unit.

Retorna 0 se não houver instruções sobre qubits

Parâmetros

  • *qubits - Qubits em self para incluir. Os números inteiros são permitidos para os qubits, indicando
  • self.qubits. (indices of)

Retorna

Retorna a hora de início da primeira instrução, excluindo atrasos, sobre os qubits

Aumentos

CircuitError - se self for um circuito ainda não programado.

Tipo de retorno

Valor flutuante

qubit_stop_time

qubit_stop_time(*qubits)

GitHub

Retorna o tempo de parada da última instrução, excluindo atrasos, sobre os qubits fornecidos. Sua unidade de tempo é self.unit.

Retorna 0 se não houver instruções sobre qubits

Parâmetros

  • *qubits - Qubits em self para incluir. Os números inteiros são permitidos para os qubits, indicando
  • self.qubits. (indices of)

Retorna

Retorna o tempo de parada da última instrução, excluindo atrasos, sobre os qubits

Aumentos

CircuitError - se self for um circuito ainda não programado.

Tipo de retorno

Valor flutuante


Circuitos abstratos e físicos

Os circuitos são uma abstração de nível bastante básico dos algoritmos quânticos. No entanto, mesmo dentro desse contexto, há diferenças. Os programadores quânticos costumam querer utilizar uma ampla variedade de portas e instruções, e trabalhar em um regime em que todos os qubits interajam entre si. O hardware quântico, no entanto, geralmente possui um conjunto restrito de portas nativas, e apenas determinados pares de qubits de hardware podem interagir. Denominamos esses dois regimes de “circuitos abstratos” e “circuitos físicos”, respectivamente.

O Qiskit tem duas maneiras de distinguir um circuito que se destina a ser físico. Essa é uma verificação imprecisa, por motivos históricos; originalmente, o Qiskit nunca fez essa distinção (é por isso que o transpile() é chamado assim, e não compile!). A maneira mais explícita é por meio do atributo layout dos circuitos; se esse atributo estiver definido, o circuito certamente será físico. A maneira mais antiga, mais implícita, são os metadados dos Qubit objetos e QuantumRegister instâncias no circuito. Um circuito só pode ser considerado (conforme julgado por várias passagens do transpilador) como físico se contiver exatamente um registro quântico, que é chamado de q e possui todos os qubits do circuito em ordem de índice. Novamente, por motivos históricos, esse é o padrão para a forma QuantumCircuit(int [, int]) do construtor padrão.

Normalmente, você cria um QuantumCircuit e o constrói no sentido abstrato (independentemente dos metadados do qubit). Em seguida, você chama transpile() para compilar o circuito em um circuito com suporte de hardware. No entanto, nos casos em que você deseja escrever um circuito eficiente em termos de hardware desde o início, é possível fazer um curto-circuito na infraestrutura de compilação completa usando o método ensure_physical() método. Isso garantirá que, independentemente de como você definiu os metadados do qubit inicial, todos os requisitos para que o circuito seja considerado físico serão atendidos, com os índices de qubit mapeados para os qubits de hardware.

Para obter um controle mais completo sobre a escolha de um mapeamento e roteamento virtual para físico, consulte os estágios de layout e roteamento <transpiler-preset-stage-routing> dos pipelines de compilação predefinidos.

ensure_physical

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

GitHub

Coloque esse circuito na forma física canônica, com o número determinado de qubits, se ainda não o tiver feito.

Várias passagens do transpilador Qiskit só fazem sentido quando aplicadas a circuitos definidos em termos de qubits físicos. Se você construiu manualmente um circuito em que os índices de qubit correspondem a qubits físicos, use essa função para garantir que os metadados do circuito correspondam à forma física canônica. Isso significa substituir os dados do qubit por um único registro proprietário chamado "q" e (opcionalmente) definir o campo layout do circuito para vincular esses qubits físicos com os virtuais originais.

Se o circuito ainda não tiver um layout, esse método (com apply_layout=True) é equivalente a aplicar o método de layout trivial completo do pipeline de compilação predefinido.

Se o circuito já for canonicamente físico, nada acontecerá com ele. Esse método não pode alterar o número de qubits no circuito se ele já tiver um layout conjunto.

Parâmetros

  • num_qubits (int | None) – se for fornecido, expanda o circuito com ancillas até esse tamanho. Os ancillas sempre serão os índices de qubit mais altos do circuito. Se não for fornecido (o padrão), o circuito permanecerá com a mesma largura. Essa opção não poderá ser definida se o circuito já estiver como um layout.
  • apply_layout (bool) – se for verdadeiro (o padrão), defina o atributo layout do circuito adequadamente, de modo que o circuito pareça ter sido projetado com o layout "trivial", incluindo a expansão de ancilla, para um backend de largura num_qubits. Isso não terá efeito se o circuito já tiver um layout.

Retorna

se o circuito foi modificado para torná-lo físico.

Aumentos

  • ValueError - se num_qubits for muito pequeno para o circuito.
  • CircuitError - se num_qubits estiver definido para tentar expandir o circuito, mas o circuito já tiver um layout definido.

Tipo de retorno

bool


Métodos semelhantes a instruções

QuantumCircuit também contém um pequeno número de métodos que são muito Instruction-semelhantes em detalhes. É bem possível que você encontre uma melhor integração e mais suporte da API se primeiro converter seu circuito em um circuito Instruction (to_instruction()) ou Gate (to_gate()), conforme o caso, e depois chamar o método correspondente.

control

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

GitHub

Retorne a versão controlada deste circuito.

O circuito original é convertido em um portão, e o circuito resultante contém a versão controlada desse portão. Esta porta controlada é implementada como ControlledGate quando annotated é False, e como AnnotatedOperation quando annotated é True.

Obsoleto desde a versão 2.3

qiskit.circuit.quantumcircuit.QuantumCircuit.control()O argumento annotated está obsoleto a partir do Qiskit 2.3. Ele será removido no Qiskit 3.0. O método QuantumCircuit.control não aceita mais annotated=None. O novo padrão é annotated=True, que representa o portão controlado no novo circuito quântico como um portão controlado ( AnnotatedOperation ), a menos que já exista uma classe dedicada de portão controlado. Você pode definir explicitamente annotated=False para preservar o comportamento anterior. No entanto, recomenda-se usar annotated=True, pois isso adia a construção do circuito controlado para o transpiler e, além disso, permite otimizações adicionais do gate controlado (geralmente levando a circuitos de maior qualidade).

Parâmetros

  • num_ctrl_qubits (int) – Número de controles a serem adicionados. Padroniza para 1.
  • label (str | None) – Uma etiqueta opcional para dar ao portão controlado uma visualização. Padroniza para None. Ignorado se o gate controlado for implementado como uma operação anotada.
  • ctrl_state (str |int | None) – O estado de controle da porta, especificado como um número inteiro ou uma sequência de bits (por exemplo "110"). Se None, o padrão é o estado 2**num_ctrl_qubits - 1todos-uns.
  • annotated (bool | None) – Indica se o gate controlado deve ser implementado como um gate controlado ou como uma operação anotada.

Retorna

A versão controlada desse circuito.

Tipo de retorno

QuantumCircuit

Aumentos

CircuitError - Se o circuito contiver uma operação não unitária e não puder ser controlado.

inverse

inverse(annotated=False)

GitHub

Inverta (faça o adjunto) esse circuito.

Isso é feito por meio da inversão recursiva de todas as portas.

Parâmetros

annotated (bool) – indica se a porta inversa pode ser implementada como uma porta anotada.

Retorna

o circuito invertido

Tipo de retorno

QuantumCircuit

Aumentos

CircuitError - se o circuito não puder ser invertido.

Exemplos

entrada:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

saída:

                  ┌───┐
q_0: ──────■──────┤ H ├
     ┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
     └───────────┘

power

power(power, matrix_power=False, annotated=False)

GitHub

Eleve esse circuito à potência de power.

Se power for um número inteiro positivo e tanto matrix_power quanto annotated forem False, o padrão desta implementação é chamar repeat. Caso contrário, o circuito é convertido em uma porta, e um novo circuito, contendo essa porta elevada à potência determinada, é retornado. A porta elevada à potência dada é implementada como uma porta unitária se annotated for False ou como uma operação anotada se annotated for True.

Parâmetros

  • power (float) – O poder de elevar esse circuito para.
  • matrix_power (bool) – indica se a porta de alimentação interna pode ser implementada como uma porta unitária.
  • annotated (bool) – indica se o power gate interno pode ser implementado como uma operação anotada.

Aumentos

CircuitError - Se o circuito precisar ser convertido em uma porta unitária, mas não for unitário.

Retorna

Um circuito que implementa esse circuito elevado à potência de power.

Tipo de retorno

QuantumCircuit

repeat

repeat(reps, *, insert_barriers=False)

GitHub

Repita esse circuito reps vezes.

Parâmetros

  • reps (int) – Com que frequência esse circuito deve ser repetido.
  • insert_barriers (bool) – Se deve incluir barreiras entre as repetições do circuito.

Retorna

Um circuito contendo reps repetições desse circuito.

Tipo de retorno

QuantumCircuit

reverse_ops

reverse_ops()

GitHub

Inverta o circuito invertendo a ordem das instruções.

Isso é feito por meio da inversão recursiva de todas as instruções. Ele não inverte (adjunto) nenhuma porta.

Retorna

o circuito invertido.

Tipo de retorno

QuantumCircuit

Exemplos

entrada:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

saída:

                 ┌───┐
q_0: ─────■──────┤ H ├
     ┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
     └──────────┘

Visualização

O Qiskit inclui algumas ferramentas de desenho para que você tenha uma ideia rápida da aparência do seu circuito. Esse ferramental é voltado principalmente para a produção de um Matplotlib - ou um desenho baseado em texto. Há também um backend LaTeX com menos recursos para desenho, mas ele serve apenas para circuitos simples e não é mantido de forma tão ativa.

Veja Também

qiskit.visualization

A documentação principal de todas as ferramentas de visualização do 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

Desenhe o circuito quântico. Use o parâmetro de saída para escolher o formato de desenho:

text

Arte ASCII TextDrawing que pode ser exibida no console.

mpl

Imagens com cores geradas inteiramente em Python usando o matplotlib.

latex

Imagens de alta qualidade compiladas a partir do site LaTeX.

Aviso

Por padrão, isso chamará uma versão do sistema instalada pdflatex com base em qualquer entrada do usuário (por exemplo, para executar código Instruction.label personalizado), portanto, só deve ser usado com entradas confiáveis.

latex_source

Saída bruta e não compilada do LaTeX. Esta é a fonte do que seria renderizado pelo latex desenhador.

Aviso

O suporte para Expr nós em condições e campos SwitchCaseOp.target é preliminar e incompleto. As gavetas text e mpl farão o melhor esforço possível para mostrar as dependências de dados, mas as gavetas LaTeX-based as ignorarão completamente.

Parâmetros

  • output (str | None) – Selecione o método de saída a ser usado para desenhar o circuito. As opções válidas são text, mpl, latex, latex_source. Por padrão, a gaveta text é usada, a menos que o arquivo de configuração do usuário (geralmente ~/.qiskit/settings.conf) tenha um backend alternativo definido como padrão. Por exemplo, circuit_drawer = latex. Se o kwarg de saída for definido, esse backend sempre será usado em vez do padrão no arquivo de configuração do usuário.

  • scale (float | None) – Escala da imagem a ser desenhada (reduzir se < 1.0). Usado somente pelas saídas mpl, latex e latex_source . O padrão é 1.0.

  • filename (str | None) – Caminho do arquivo para salvar a imagem. O padrão é None (o resultado não é salvo em um arquivo).

  • style (dict |str | None) –

    Nome do estilo, nome do arquivo JSON do estilo ou um dicionário que especifique o estilo.

    • Os nomes de estilo compatíveis são "iqp" (padrão), "iqp-dark", "clifford", "textbook" e "bw".
    • Se for fornecido um arquivo JSON, por exemplo my_style.json ou my_style (a extensão .json pode ser omitida), essa função tenta carregar o dicionário de estilos a partir desse local. Observe que o arquivo JSON deve especificar completamente as especificações de visualização. O arquivo é pesquisado em qiskit/visualization/circuit/styles, no diretório de trabalho atual e no local especificado em ~/.qiskit/settings.conf.
    • Se for um dicionário, cada entrada substitui a configuração padrão. Se a "name" chave for especificada, a configuração padrão será determinada por esse estilo. Por exemplo, {"name": "textbook", "subfontsize": 5} carrega o "textbook" estilo e define o tamanho da subfonte (por exemplo, os ângulos das portas) para 5.
    • Se None , o estilo padrão "iqp" é usado ou, se fornecido, o estilo padrão especificado em ~/.qiskit/settings.conf.
  • interactive (bool) – Quando definido como True, mostre o circuito em uma nova janela (para mpl , isso depende do suporte do backend do matplotlib que está sendo usado). Observe que, quando usado com o tipo de saída texto ou latex_source , isso não tem efeito e será silenciosamente ignorado. O padrão é False.

  • reverse_bits (bool | None) – Quando definido como True, inverta a ordem dos bits dentro dos registros para a visualização da saída. O padrão é False , a menos que o arquivo de configuração do usuário (geralmente ~/.qiskit/settings.conf) tenha um valor alternativo definido. Por exemplo, circuit_reverse_bits = True.

  • plot_barriers (bool) – Ativar/desativar barreiras de desenho no circuito de saída. Padroniza para True.

  • justify (str | None) – As opções são "left", "right" ou "none" (str). Se qualquer outra coisa for fornecida, será usado o justificado à esquerda. Refere-se ao local onde as portas devem ser colocadas no circuito de saída, se houver uma opção. none faz com que cada porta seja colocada em sua própria coluna. O padrão é left.

  • vertical_compression (str | None) – high, medium ou low. Ele mescla as linhas geradas pela saída de texto para que o desenho ocupe menos espaço vertical. O padrão é medium. Usado somente pela saída text ; caso contrário, será silenciosamente ignorado.

  • idle_wires (bool |str | None) – Incluir (ou não) fios ociosos (fios sem elementos de circuito) na visualização da saída. Também é possível usar "auto" a sequência de caracteres, caso em que os fios ociosos são exibidos, exceto quando o circuito possui um layout associado. O valor padrão é, a menos "auto" que o arquivo de configuração do usuário (geralmente ~/.qiskit/settings.conf) tenha um valor alternativo definido. Por exemplo, circuit_idle_wires = False.

  • with_layout (bool) – Inclua informações de layout, com rótulos no layout físico. O padrão é True.

  • fold (int | None) – Define a paginação. Ele pode ser desativado usando -1. Em text, define o comprimento das linhas. Isso é útil quando o desenho não cabe no console. Se for None (padrão), ele tentará adivinhar a largura do console usando shutil.get_terminal_size(). No entanto, se estiver sendo executado no jupyter, o comprimento de linha padrão é definido como 80 caracteres. Em mpl, é o número de camadas (visuais) antes da dobragem. O padrão é 25.

  • ax (Any | None) – Usado apenas pelo backend mpl. Um objeto matplotlib.axes.Axes opcional a ser usado para a saída de visualização. Se nenhum for especificado, uma nova figura matplotlib será criada e utilizada. Além disso, se especificado, não haverá retorno da Figura, pois é redundante.

  • initial_state (bool) – Adiciona 0|0\rangle no início dos fios do qubit e 00 aos fios clássicos. O padrão é False.

  • cregbundle (bool | None) – Se definido como True, agrupa os registros clássicos. O padrão é True, exceto quando output é definido como "text".

  • wire_order (list[int] | None) – Uma lista de números inteiros usados para reordenar a exibição dos bits. A lista deve ter uma entrada para cada bit com os bits no intervalo de 0 a (num_qubits + num_clbits).

  • expr_len (int) – O número de caracteres a serem exibidos se um Expr for usado para a condição em um ControlFlowOp. Se esse número for excedido, a cadeia de caracteres será truncada nesse número e '...' será adicionado ao final.

  • measure_arrows (bool | None) – Se for verdadeiro, desenhe uma seta a partir de cada caixa de medida até o bit ou registro clássico onde o valor da medida está localizado. Se for False, não desenhe a seta, mas coloque o nome do bit ou do registro na caixa de medida. O valor padrão é, a menos True que o arquivo de configuração do usuário (geralmente ~/.qiskit/settings.conf) tenha um valor alternativo definido. Por exemplo, circuit_measure_arrows = False.

  • barrier_label_len (int) – O número de caracteres a serem exibidos para Barrier os rótulos no circuito de saída. Se esse número for excedido, a sequência de caracteres será truncada nesse ponto e “...” será adicionado ao final.

Retorna

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

  • TextDrawing (se output='text')

    Um desenho que pode ser impresso como arte ascii.

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

    Um objeto de figura matplotlib para o diagrama de circuito.

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

    Uma representação na memória da imagem do diagrama do circuito.

  • str (se output='latex_source')

    O código-fonte LaTeX para visualizar o diagrama do circuito.

Aumentos

  • VisualizationError - quando um método de saída inválido é selecionado
  • ImportError - quando os métodos de saída exigirem bibliotecas não instaladas.

Exemplo

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 de circuito gerado pelo código anterior.

Além do driver principal draw() existem dois métodos auxiliares relacionados à visualização, que são úteis principalmente para desembrulhar rapidamente algumas instruções internas ou inverter as convenções de rotulagem de qubit no desenho. Para uma mutação mais geral, incluindo a reescrita de base-gate, você deve usar o transpilador (qiskit.transpiler).

decompose

decompose(gates_to_decompose=None, reps=1)

GitHub

Chame uma passagem de decomposição nesse circuito, para decompor um nível (decomposição superficial).

Parâmetros

  • gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – Subconjunto opcional de portas a serem decompostas. Pode ser um tipo de porta, como HGate, ou um nome de porta, como “h”, ou um rótulo de porta, como “Minha Porta H”, ou uma lista de qualquer combinação desses elementos. Se for inserido o nome de um gate, serão analisados todos os gates com esse nome, independentemente de terem ou não rótulos. Por padrão, abrange todas as portas do circuito.
  • reps (int) – Número opcional de vezes que o circuito deve ser decomposto. Por exemplo, reps=2 é igual a chamar circuit.decompose().decompose().

Retorna

um circuito decomposto em um nível

Tipo de retorno

QuantumCircuit

reverse_bits

reverse_bits()

GitHub

Retorne um circuito com a ordem oposta dos fios.

O circuito é invertido "verticalmente". Se um circuito for definido em vários registros, o circuito resultante terá os mesmos registros, mas com a ordem invertida.

Esse método é útil para converter um circuito escrito na convenção little-endian para o equivalente big-endian e vice-versa.

Retorna

o circuito com a ordem dos bits invertida.

Tipo de retorno

QuantumCircuit

Exemplos

entrada:

     ┌───┐
a_0: ┤ H ├──■─────────────────
     └───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
          └───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
               └───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
                    └───┘┌─┴─┐
b_1: ────────────────────┤ X ├
                         └───┘

saída:

                         ┌───┐
b_0: ────────────────────┤ X ├
                    ┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
               ┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
          ┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
     ┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
     └───┘

Parâmetros

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.