QuantumCircuit aula
class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
Bases: object
Representação do núcleo Qiskit de um circuito quântico.
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_phase | A fase global do circuito, medida em radianos. |
metadata | Mapeamento arbitrário do usuário, que o Qiskit preservará por meio do transpilador, mas que, de outra forma, será completamente ignorado. |
name | Um nome de cadeia de caracteres opcional para o circuito. |
Atributo de dados imutável | Resumo |
|---|---|
ancillas | Lista de AncillaQubits rastreados pelo circuito. |
cregs | Lista de ClassicalRegisters rastreados pelo circuito. |
clbits | Lista de Clbits rastreados pelo circuito. |
data | Lista de indivíduos CircuitInstructions que compõem o circuito. |
_data | Python -identificador de espaço para o objeto da QkCircuit API C. |
duration | Duração total do circuito, adicionada pelo agendamento de passagens do transpilador. Esse atributo está obsoleto e estimate_duration() deve ser usado em seu lugar. |
layout | Informações de layout de hardware e roteamento adicionadas pelo transpilador. |
num_ancillas | O número de qubits de ancilla no circuito. |
num_clbits | O número de clbits no circuito. |
num_captured_vars | Número de variáveis clássicas capturadas em tempo real. |
num_captured_stretches | Número de trechos capturados. |
num_declared_vars | Número de variáveis clássicas em tempo real declaradas localmente no escopo do circuito externo. |
num_declared_stretches | Número de trechos declarados localmente no escopo do circuito externo. |
num_input_vars | Número de variáveis clássicas em tempo real de entrada. |
num_parameters | Número de tempos de compilação Parameters no circuito. |
num_qubits | Número de qubits no circuito. |
num_vars | Número total de variáveis clássicas em tempo real no escopo do circuito externo. |
num_stretches | Número total de trechos no escopo do circuito externo. |
num_identifiers | Número total de variáveis e trechos no circuito externo. |
op_start_times | Horários de início das operações programadas, adicionados pelo agendamento de passagens do transpilador. |
parameters | Visão ordenada em forma de conjunto do tempo de compilação Parameters rastreados pelo circuito. |
qregs | Lista de QuantumRegisters rastreados pelo circuito. |
qubits | Lista de Qubits rastreados pelo circuito. |
unit | A 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.0from numpy import pi
circuit.global_phase = pi/4
print(circuit.global_phase)0.7853981633974483O 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_circuitVocê 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.
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.
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.
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: 2098Retorna
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: 1num_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: 1num_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=())
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
Registerrepresenta os objetosQuantumRegistere/ouClassicalRegisterobjetos 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 qubitsQuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
-
Se uma lista de listas python contendo
Bitobjetos, uma coleção deBits 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
metadataatributo. Ele não será usado diretamente no circuito. -
inputs (Iterable[Var]) – algumas variáveis a serem declaradas como variáveis
inputde tempo de execução para este circuito. Esses já devem ser nósexpr.Varexistentes que você criou em outro lugar; se precisar criar as entradas também, useQuantumCircuit.add_input(). As variáveis fornecidas neste argumento serão passadas diretamente paraadd_input(). Um circuito não pode ter tantoinputsquantocaptures. -
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 tantoinputsquantocaptures. -
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
inputsecapturesforem 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)
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
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')
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.
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
inputna fonte serão variáveisinputno 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, poiscompose()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
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)
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 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)
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
qasm2.load(): a interface completa do importador OpenQASM 2.
from_qasm_str
static from_qasm_str(qasm_str)
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
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
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)
Adicione registros.
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)
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
Varreutilizaçã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 useexpr.cast()para converter o inicializador para o tipo desejado.Isso deve ser um nó
Exprou um valor que pode ser elevado a um nó usandoexpr.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
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
Registre uma variável como uma entrada para o circuito.
Parâmetros
- name_or_var (str |Var) – um nome de string ou um nó
Varexistente 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
Typea ser usada para a variável. Se a variável for fornecida como um objeto existenteVarexistente, 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
add_stretch
add_stretch(name_or_stretch)
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
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, /)
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.
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)
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)
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.
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
Bitfornecido for de um tipo desconhecido. - CircuitError - Se o cabo fornecido
Bitnã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)
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
Trabalhando com parâmetros de tempo de compilação
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
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.
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
Trueeparametersé um tipo de mapeamento, presume-se que seja exatamente um mapeamento de{parameter: value}. Por padrão (False), o mapeamento também pode conterParameterVectorchaves 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 emParameterinstâncias usandoget_parameter(). - strict (bool) – Se houver
False, quaisquer parâmetros especificados no mapeamento que não sejam utilizados no circuito serão ignorados. SeTrue(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')

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

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, /)
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
QuantumCircuit.get_parameter()
Recupera a instância Parameter desse circuito por nome.
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
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
KeyErroruma 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
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_againObté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 NoneTrabalhando com dados clássicos digitados em tempo real
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.
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
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
KeyErroruma 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_againObté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 Noneget_stretch
get_stretch(name: str, default: T) → Stretch | T
get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch
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
KeyErroruma 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_againObté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 Noneget_identifier
get_identifier(name: str, default: T) → Var | Stretch | T
get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch
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
KeyErroruma exceção.
Retorna
A variável correspondente.
Aumentos
KeyError - se nenhum padrão for fornecido, mas o identificador não existir.
Obtém um identificador conhecido por ser uma expr.Var instância.
Obtém um identificador conhecido por ser uma expr.Stretch instância.
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, /)
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
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, /)
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
Recupera a instância expr.Stretch desse circuito por nome.
has_identifier
has_identifier(name_or_ident, /)
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
QuantumCircuit.get_identifier()
Recupere o expr.Var ou expr.Stretch desse circuito por nome.
O mesmo que este método, mas ignorando qualquer coisa que não seja uma variável em tempo de execução expr.Var .
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()
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_stretches
iter_stretches()
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_input_vars
iter_input_vars()
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_captured_vars
iter_captured_vars()
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_captured_stretches
iter_captured_stretches()
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_declared_vars
iter_declared_vars()
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_declared_stretches
iter_declared_stretches()
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
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.
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)
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
- instruction (Operation |CircuitInstruction) –
Instructionpara anexar, ou uma instânciaCircuitInstructioncom todo o seu contexto. - qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – especificadores aos quais a instrução
Qubitdeve ser anexada. - cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – especificadores aos quais a instrução
Clbitdeve ser anexada. - copy (bool) – se for
True(o padrão), a entradainstructionserá copiada antes de ser adicionada ao circuito se contiver parâmetros simbólicos, para que possa ser alterada com segurança sem afetar outros circuitos em que a mesma instrução possa estar. Se tiver certeza de que essa instrução não estará em outros circuitos, você pode definir esseFalsepara um pequeno aumento de velocidade.
Retorna
uma alça para os CircuitInstructions que foram de fato adicionados ao circuito.
Tipo de retorno
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
Anexar uma instrução ao final do circuito, modificando o circuito no local.
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.
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
CircuitInstructionda operação e seu contexto a ser adicionado.Na forma de compatibilidade herdada, isso pode ser um simples
Operatione, nesse caso,qargsecargsdevem ser fornecidos explicitamente. -
qargs - Argumento de legado para os qubits aos quais anexar o bare
Operationa. Ignorado se o primeiro argumento estiver na forma preferencialCircuitInstructionpreferencial. -
cargs - Argumento de legado para clbits para anexar o bare
Operationa. Ignorado se o primeiro argumento estiver na forma preferencialCircuitInstructionpreferencial. -
_standard_gate (bool)
Retorna
um identificador da instrução que acabou de ser adicionada.
Tipo de retorno
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
Aplicar as instruções de um circuito em qubits e/ou clbits especificados em outro.
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():
- O circuito
otheré tratado como totalmente aditivo, inclusive suas variáveis. As variáveis emotherdevem ser totalmente distintas das variáveis emself(usevar_remappara ajudar nisso), e todas as variáveis emotherserão declaradas novamente na saída com o escopo de entrada/captura/local correspondente ao modo como estão emother. Geralmente, é isso que você deseja se estiver unindo dois circuitos não relacionados. - O circuito
otherfoi criado como uma extensão exata doselfpara ser incorporado a ele, inclusive atuando sobre as variáveis existentes em seus estados no final doself. Nesse caso, o siteotherdeve ser criado com todas essas variáveis a serem incluídas declaradas como "capturas" e, em seguida, você pode usar o siteinline_captures=Truenesse 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 argumentovars_mode="captures"paracopy_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 oappendaceite. -
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 comoFalsese a entrada for considerada propriedade do circuito base, a fim de evitar cópias desnecessárias; nesse caso, não é válido usarotherposteriormente, e algumas instruções podem ter sofrido mutação no local. -
var_remap (Mapping) –
mapeamento a ser usado para reescrever
expr.Vareexpr.Stretchemotherà medida que são incorporados emself. 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
VarouStretchcom o mesmo nome. Se um valor for uma string, sempre que uma nova chave corresponder a ele, um novoVarouStretché criado com o tipo correto. Se um valor for umVarseu endereçotypedeve corresponder exatamente ao da variável que está substituindo. -
inline_captures (bool) –
se
True, então todos os nós de identificadores "capturados" nootherQuantumCircuitsão considerados como referentes a identificadores já declarados emself(como qualquer tipo de entrada/captura/local), e os usos emotherserão aplicados aos identificadores existentes. Se você quiser criar uma camada para um circuito existente a ser usado comcompose()poderá achar útil o argumentovars_mode="captures"paracopy_empty_like()útil. Qualquer remapeamento emvars_remapocorre antes da avaliação dessa variável inlining.Se for
False(o padrão), todos os identificadores emotherdeverão ser distintos daqueles emself, 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()outo_gate()e, em seguida, chamarappend().
Retorna
o circuito composto (retorna None se inplace==True).
Tipo de retorno
Aumentos
- CircuitError - se não for possível fazer o mapeamento correto dos fios entre os dois circuitos, por exemplo, se
otherfor mais largo queself. - CircuitError - se tentar emitir um novo circuito enquanto
selftiver um contexto de fluxo de controle parcialmente construído ativo, como as formas de gerenciador de contexto deif_test(),for_loop()ewhile_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)
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')
Retorna
O circuito tensionado (retorna None se inplace=True).
Tipo de retorno
Parâmetros
- other (QuantumCircuit)
- inplace (bool)
Como algumas regras gerais:
- Se você tiver um único
Operation,InstructionouGatevocê definitivamente deve usarappend()ou_append(). - Se você tiver um
QuantumCircuitque representa uma única instrução atômica para um circuito maior que deseja reutilizar, provavelmente desejará chamarto_instruction()outo_gate()e, em seguida, aplicar o resultado disso ao circuito usandoappend(). - Se você tiver um circuito
QuantumCircuitque represente uma "camada" maior de outro circuito, ou que contenha variáveis clássicas tipadas ou fluxo de controle, você deve usarcompose()para mesclá-lo em outro circuito. tensor()é procurado muito mais raramente do queappend()oucompose(). Internamente, ele é basicamente um invólucro em torno deadd_bits()ecompose().
Algumas armadilhas em potencial com as quais você deve tomar cuidado:
- Mesmo que você reutilize um
Instructionpersonalizado 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 oto_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 definirinplace=True.- Ambos
append()ecompose()(mas não_append()) têm um argumento de palavra-chavecopyque tem como padrãoTrue. Nesses casos, as instâncias de entradaOperationrecebidas 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, definacopy=Falsepara 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:
QuantumCircuit método | |
|---|---|
barrier() | Barrier |
delay() | Delay |
initialize() | Initialize |
measure() | Measure |
reset() | Reset |
store() | Store |
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:
QuantumCircuit método | |
|---|---|
ccx() | CCXGate |
ccz() | CCZGate |
ch() | CHGate |
cp() | CPhaseGate |
crx() | CRXGate |
cry() | CRYGate |
crz() | CRZGate |
cs() | CSGate |
csdg() | CSdgGate |
cswap() | CSwapGate |
csx() | CSXGate |
cu() | CUGate |
cx() | CXGate |
cy() | CYGate |
cz() | CZGate |
Por 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)
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
ccx
ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)
Aplicar CCXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como primeiro controle.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como segundo controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
ccz
ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)
Aplicar CCZGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como primeiro controle.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como segundo controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '10'). O padrão é o controle no estado "11".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
ch
ch(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CHGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cp
cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CPhaseGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
crx
crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CRXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cry
cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CRYGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
crz
crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CRZGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cs
cs(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CSGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
csdg
csdg(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CSdgGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cswap
cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)
Aplicar CSwapGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- target_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo,
'1'). O padrão é o controle no estado'1'.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
csx
csx(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CSXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cu
cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CUGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- phi (ParameterExpression |float) – O ângulo de rotação da porta.
- lam (ParameterExpression |float) – O ângulo de rotação da porta.
- gamma (ParameterExpression |float) – A fase global aplicada do portão U, se aplicada.
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cx
cx(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cy
cy(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CYGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
cz
cz(control_qubit, target_qubit, label=None, ctrl_state=None)
Aplicar CZGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
dcx
dcx(qubit1, qubit2)
Aplicar DCXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- qubit2 (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
delay
delay(duration, qarg=None, unit=None)
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 tipoDuration. - qarg (Object) – para aplicar esse atraso.
- unit (str | None) – unidade da duração, a menos que
durationseja umExprcaso 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
Aumentos
CircuitError - se os argumentos tiverem um formato ruim.
ecr
ecr(qubit1, qubit2)
Aplicar ECRGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
h
h(qubit)
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
id
id(qubit)
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
initialize
initialize(params, qubits=None, normalize=False)
Inicializar os qubits em um estado específico.
A inicialização do Qubit é feita primeiro redefinindo os qubits para 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 e o qubit um em . - Um número inteiro que é usado como um mapa de bits indicando quais qubits devem ser inicializados em . Exemplo: definir params como 5 inicializaria o qubit 0 e o qubit 2 em e o qubit 1 em .
-
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 .
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 . 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)
Aplicar iSwapGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
mcp
mcp(lam, control_qubits, target_qubit, ctrl_state=None)
Aplicar MCPhaseGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- lam (ParameterExpression |float) – O ângulo da rotação.
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
mcrx
mcrx(theta, q_controls, q_target, use_basis_gates=False)
Aplicar a porta de rotação X com controle múltiplo
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O qubit ao qual a porta se refere.
- use_basis_gates (bool) – use as portas de base p, u, cx.
mcry
mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)
Aplicar a porta de rotação Y com controle múltiplo
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O qubit ao qual a porta se refere.
- q_ancillae (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – A lista de qubits auxiliares.
- mode (str | None) – O modo de implementação a ser usado.
- use_basis_gates (bool) – usar portas de base p, u, cx
mcrz
mcrz(lam, q_controls, q_target, use_basis_gates=False)
Aplicar a porta de rotação Z com controle múltiplo
Parâmetros
- lam (ParameterExpression |float) – O ângulo da rotação.
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits utilizados como controles.
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O qubit ao qual a porta se refere.
- use_basis_gates (bool) – use as portas de base p, u, cx.
mcx
mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)
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.
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
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits utilizados como controles.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
- ancilla_qubits (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – Os qubits utilizados como ancillae, caso o modo o exija.
- mode (str | None) – A escolha do modo, explicada mais acima.
- ctrl_state (str |int | None) – O estado de controle em decimal ou como uma cadeia de bits (por exemplo, '1'). O padrão é o controle no estado "1".
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
measure
measure(qubit, cbit)
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 ou . 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
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – qubit(s) a serem medidos.
- cbit (Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]) – bits clássicos para armazenar o(s) resultado(s) da medição.
Retorna
para as instruções adicionais.
Tipo de retorno
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)
Aplicar MSGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits aos quais a porta será aplicada.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
p
p(theta, qubit)
Aplicar PhaseGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- 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
pauli
pauli(pauli_string, qubits)
Aplicar PauliGate.
Parâmetros
- pauli_string (str) – Uma cadeia de caracteres que representa o operador Pauli a ser aplicado, por exemplo, 'XX'.
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – Os qubits aos quais aplicar essa porta.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
prepare_state
prepare_state(state, qubits=None, label=None, normalize=False)
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 e o qubit um em . - Um número inteiro que é usado como um mapa de bits indicando quais qubits devem ser inicializados em . Exemplo: definir params como 5 inicializaria o qubit 0 e o qubit 2 em e o qubit 1 em .
-
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
Exemplos
Prepare um qubit no estado .
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()saída:
┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
└─────────────────────────────────────┘Prepare a partir de uma cadeia dois qubits no estado . 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)
Aplicar RGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- phi (ParameterExpression |float) – O ângulo do eixo de rotação no plano x-y.
- 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
rcccx
rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)
Aplicar RC3XGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como primeiro controle.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como segundo controle.
- control_qubit3 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como terceiro controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
rccx
rccx(control_qubit1, control_qubit2, target_qubit)
Aplicar RCCXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como primeiro controle.
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) utilizado(s) como segundo controle.
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) a porta se destina.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
reset
reset(qubit)
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
rv
rv(vx, vy, vz, qubit)
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 , em que é o ângulo de rotação em radianos.
Parâmetros
- vx (ParameterExpression |float) – componente x do eixo de rotação.
- vy (ParameterExpression |float) – componente y do eixo de rotação.
- vz (ParameterExpression |float) – componente z do eixo de rotação.
- 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
rx
rx(theta, qubit, label=None)
Aplicar RXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
rxx
rxx(theta, qubit1, qubit2)
Aplicar RXXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo da rotação.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- qubit2 (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
ry
ry(theta, qubit, label=None)
Aplicar RYGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
ryy
ryy(theta, qubit1, qubit2)
Aplicar RYYGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- qubit2 (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
rz
rz(phi, qubit)
Aplicar RZGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- phi (ParameterExpression |float) – O ângulo de rotação da porta.
- 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
rzx
rzx(theta, qubit1, qubit2)
Aplicar RZXGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- qubit2 (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
rzz
rzz(theta, qubit1, qubit2)
Aplicar RZZGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – O(s) qubit(s) ao(s) qual(is) aplicar a porta.
- qubit2 (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
s
s(qubit)
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
sdg
sdg(qubit)
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
store
store(lvalue, rvalue, /)
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ó
Varmas você também pode escrever emClbitouClassicalRegisterlocais 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
A classe de apoio Instruction que representa essa operação.
Crie uma nova variável no circuito que possa ser gravada com esse método.
swap
swap(qubit1, qubit2)
Aplicar SwapGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – Os qubits aos quais a porta será aplicada.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
sx
sx(qubit)
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
sxdg
sxdg(qubit)
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
t
t(qubit)
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
tdg
tdg(qubit)
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
u
u(theta, phi, lam, qubit)
Aplicar UGate.
Para obter a forma completa da matriz dessa porta, consulte a documentação da porta subjacente.
Parâmetros
- theta (ParameterExpression |float) – O ângulo de rotação da porta.
- phi (ParameterExpression |float) – O ângulo de rotação da porta.
- lam (ParameterExpression |float) – O ângulo de rotação da porta.
- 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
unitary
unitary(obj, qubits, label=None)
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
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)
Aplicar XGate.
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.
- label (str | None) – O rótulo da cadeia de caracteres da porta no circuito.
Retorna
Um identificador para as instruções criadas.
Tipo de retorno
y
y(qubit)
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
z
z(qubit)
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
Adicionando fluxo de controle aos circuitos
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 método | Instrução de fluxo de controle |
|---|---|
if_test() | IfElseOp com apenas um corpo True |
if_else() | IfElseOp com os corpos True e False |
while_loop() | WhileLoopOp |
switch() | SwitchCaseOp |
for_loop() | ForLoopOp |
box() | BoxOp |
break_loop() | BreakLoopOp |
continue_loop() | ContinueLoopOp |
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)
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
QuantumCircuitposicionalmente, e os sitesqubitseclbitsem que ele atua. Nesse formato, umBoxOpé imediatamente criado e anexado usando o circuito como corpo. - Use em uma declaração
withsembody,qubitsouclbits. Esse é o "formulário de interface do construtor", no qual você usa outrosQuantumCircuitmétodos no escopo Pythonwithpara adicionar instruções aobox. 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
QuantumCircuitfor passado de forma posicional, ele será imediatamente usado como o corpo da caixa, equbitseclbitstambém deverão ser especificados. Se não for fornecido, ou se for fornecido um iterável de objetosAnnotationo formulário do gerenciador de contexto desse método será acionado. - qubits (Sequence[QubitSpecifier] | None) – os qubits aos quais aplicar o
BoxOpna 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
Annotationobjetos 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()
Aplicar BreakLoopOp.
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
continue_loop
continue_loop()
Aplicar ContinueLoopOp.
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
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
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
bodyao qual os valores deindexsetserã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çãowith. Ele só será ligado ao circuito se for usado dentro do corpo.Se esse argumento for
Nonena forma manual desse método,bodyserá repetido uma vez para cada um dos itens emindexset, 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)
Aplicar IfElseOp.
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 umClassicalRegistera ser testado quanto à igualdade com um determinadoint, ou como uma tupla de umClbita ser comparado com umboolou umint. - true_body (QuantumCircuit) – O corpo do circuito a ser executado se
conditionfor verdadeiro. - false_body (QuantumCircuit) – O circuito a ser executado se
conditionfor 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
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
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 deClassicalRegistera ser testada para igualdade com um determinadoint, ou como uma tupla deClbita ser comparada com umboolou umint. - true_body (Optional[QuantumCircuit]) – O corpo do circuito a ser executado se
conditionfor 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
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_DEFAULTcorresponde 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
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 umClassicalRegisterou aClbite 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)
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()
Verifica se o circuito tem uma instância de ControlFlowOp presente em suas operações.
Tipo de retorno
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)
Crie um Instruction a partir desse circuito.
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
to_gate
to_gate(parameter_map=None, label=None)
Crie um Gate a partir desse circuito. O circuito deve atuar somente em qubits e conter somente operações unitárias.
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
Além disso, você pode converter todo o circuito na DAGCircuit representação:
to_dag
to_dag(*, copy_operations=True)
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
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)
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
measure_all
measure_all(inplace=True, add_bits=True)
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
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()
Limpar todas as instruções em si mesmo.
A limpeza dos circuitos manterá os metadados.
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)
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)
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.
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
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')
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() == 12Também podemos simplesmente obter o número de qubits diretamente usando num_qubits:
assert qc.num_qubits == 12Para 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() == 19count_ops
count_ops()
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>>)
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.
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
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() == 2Modificação do exemplo anterior para calcular apenas a profundidade de portas de vários qubits:
assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1get_instructions
get_instructions(name)
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
num_connected_components
num_connected_components(unitary_only=False)
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
num_nonlocal_gates
num_nonlocal_gates()
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
num_tensor_factors
num_tensor_factors()
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
num_unitary_factors
num_unitary_factors()
Calcula o número de fatores tensoriais somente na parte unitária (quântica) do circuito.
Tipo de retorno
size
size(filter_function=<function QuantumCircuit.<lambda>>)
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
width
width()
Retorna o número de qubits mais clbits no circuito.
Retorna
Largura do circuito.
Tipo de retorno
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')
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
Targetque 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 mensagemQiskitErrorserá 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
qubit_duration
qubit_duration(*qubits)
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
qubit_start_time
qubit_start_time(*qubits)
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
selfpara 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
qubit_stop_time
qubit_stop_time(*qubits)
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
selfpara 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
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)
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
layoutdo 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 larguranum_qubits. Isso não terá efeito se o circuito já tiver umlayout.
Retorna
se o circuito foi modificado para torná-lo físico.
Aumentos
- ValueError - se
num_qubitsfor muito pequeno para o circuito. - CircuitError - se
num_qubitsestiver definido para tentar expandir o circuito, mas o circuito já tiver um layout definido.
Tipo de retorno
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)
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.
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"). SeNone, o padrão é o estado2**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
Aumentos
CircuitError - Se o circuito contiver uma operação não unitária e não puder ser controlado.
inverse
inverse(annotated=False)
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
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)
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
repeat
repeat(reps, *, insert_barriers=False)
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
reverse_ops
reverse_ops()
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
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.
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)
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.
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.
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 gavetatexté 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ídasmpl,latexelatex_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). -
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.jsonoumy_style(a extensão.jsonpode 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 emqiskit/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) para5. - Se
None, o estilo padrão"iqp"é usado ou, se fornecido, o estilo padrão especificado em~/.qiskit/settings.conf.
- Os nomes de estilo compatíveis são
-
interactive (bool) – Quando definido como
True, mostre o circuito em uma nova janela (parampl, isso depende do suporte do backend do matplotlib que está sendo usado). Observe que, quando usado com o tipo de saída texto oulatex_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.nonefaz com que cada porta seja colocada em sua própria coluna. O padrão éleft. -
vertical_compression (str | None) –
high,mediumoulow. 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ídatext; 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 usandoshutil.get_terminal_size(). No entanto, se estiver sendo executado no jupyter, o comprimento de linha padrão é definido como 80 caracteres. Emmpl, é 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.Axesopcional 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 no início dos fios do qubit e 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 quandooutputé 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
Exprfor usado para a condição em umControlFlowOp. 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
Trueque 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
Barrieros 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(seoutput='text')Um desenho que pode ser impresso como arte ascii.
-
matplotlib.figure.Figure(seoutput='mpl')Um objeto de figura matplotlib para o diagrama de circuito.
-
PIL.Image(ifoutput='latex')Uma representação na memória da imagem do diagrama do circuito.
-
str(seoutput='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'})
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)
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 chamarcircuit.decompose().decompose().
Retorna
um circuito decomposto em um nível
Tipo de retorno
reverse_bits
reverse_bits()
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
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