Portuguese, Brazilian
Idiomas
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

Nota

Esta página foi gerada a partir de tutorials/circuits_advanced/07_pulse_scheduler.ipynb.

Execute interativamente no IBM Quantum lab.

Usando o agendador

O agendador irá traduzir um QuantumCircuit em um Pulso Schedule, usando a porta e calibrações de medições: uma descrição otimizada de nível pulso de uma operação em determinados qubits.

Backends que estão habilitados como OpenPulse normalmente terão calibrações definidas para medições e para cada uma de suas portas base. As calibrações também podem ser definidas ou atualizadas pelo usuário.

Uso básico

Para começar, construa um circuito quântico como você faria normalmente. Para o nosso exemplo abaixo, criamos um estado simples de Bell.

[1]:
from qiskit import QuantumCircuit

circ = QuantumCircuit(2, 2)
circ.h(0)
circ.cx(0, 1)
circ.measure([0, 1], [0, 1])

circ.draw('mpl')
[1]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_1_0.png

Usaremos o back-end simulado, FakeAlmaden, para demonstrar como usar o agendador. Ele contém calibrações padrão para medida e para as suas portas base. A operação Hadamard não é uma dessas portas base, então usamos o transpilador para compilar nosso circuito de entrada para um circuito equivalente em termos das portas base do dispositivo.

[2]:
from qiskit import transpile, schedule as build_schedule
from qiskit.test.mock import FakeAlmaden

backend = FakeAlmaden()

transpiled_circ = transpile(circ, backend)  # Undefined Hadamard is replaced by U1
schedule = build_schedule(transpiled_circ, backend)

Vamos ver como fica nosso agendamento schedule construído a partir do circuito transpiled_circ.

[3]:
schedule.draw(plot_range=[0, 2000])
[3]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_5_0.png

Isso cobre o básico! Utilizamos o transpilador para reescrever o circuito em termos das portas base e em seguida, utilizamos as calibrações padrão do backend para agendar o circuito transpilado. A seguir vamos passar pelo agendamento com calibrações que nós mesmos vamos construir.

Agendamento com definições de porta customizadas

Se seu circuito de entrada tiver calibrações definidas, ele usará essas calibrações ao agendar seu circuito.

[4]:
from qiskit import pulse

with pulse.build() as h_q0:
    pulse.play(pulse.library.Gaussian(duration=256, amp=0.2, sigma=50, name='custom'),
               pulse.DriveChannel(0))

circ.add_calibration('h', [0], h_q0)

schedule = build_schedule(circ, backend)
schedule.draw(plot_range=[0, 2000])
[4]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_7_0.png

Observe que o pulso inicial de D0, a porta Hadamard, está agora implementado com nosso pulso personalizado.

Métodos de agendamento

O agendador pode seguir várias rotinas. Por padrão, segue uma regra tão tarde quanto possível (ALAP). Outro método de agendamento é assim que possível, (ASAP). Para ambos os métodos, o cronograma de saída é mínimo: no caminho da operação de duração mais longa do circuito de entrada, o horário de início de cada operação é o momento final da operação de processo. Os métodos determinam como agendar operações fora do caminho mais longo.

Isso é explicado melhor com um exemplo:

[5]:
circ = QuantumCircuit(2, 2)
circ.x(0)
circ.x(0)
circ.x(1)
circ.measure([0, 1], [0, 1])
[5]:
<qiskit.circuit.instructionset.InstructionSet at 0x12cba98e0>

Para o nosso backend simulado, estas operações de porta \(X\) são cada uma a mesma duração (duration = 160 dt). Para que o agendamento seja mínimo, as duas operações de \(X\) no qubit 0 serão agendadas back-to-back e o pulso de medição seguirá imediatamente o segundo desses pulsos.

ALAP irá escolher o último horário válido para agendar operações menos restritas, então a porta \(X\) no qubit 1 irá executar sincronizadamente com a segunda porta \(X\) no qubit 0.

[6]:
schedule = build_schedule(circ, backend,
                          method="as_late_as_possible")
schedule.draw(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)])
[6]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_11_0.png

Por outro lado, como o nome sugere, o ASAP irá agendar as operações assim que seus recursos estiverem livres. Assim, a porta \(X\) no qubit 1 será agendada para time=0, em sincronia com a primeira porta \(X\) no bit 0.

[7]:
schedule = build_schedule(circ, backend,
                          method="as_soon_as_possible")
schedule.draw(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)])
[7]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_13_0.png

ALAP é o padrão porque permite que qubits permaneçam inativos tanto tempo quanto possível. Neste caso, a diferença entre ALAP e ASAP pode ser negligenciável, mas no ALAP, o qubit 0 não tem tempo para se decair do estado excitado antes da medição.

[8]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
Qiskit0.23.2
Terra0.16.2
Aer0.7.2
Ignis0.5.1
Aqua0.8.1
IBM Q Provider0.11.1
System information
Python3.9.1 (default, Dec 10 2020, 10:36:35) [Clang 12.0.0 (clang-1200.0.32.27)]
OSDarwin
CPUs6
Memory (Gb)32.0
Tue Jan 26 15:29:54 2021 EST

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: