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

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

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

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

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

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 Software | Version |
---|---|
Qiskit | 0.23.2 |
Terra | 0.16.2 |
Aer | 0.7.2 |
Ignis | 0.5.1 |
Aqua | 0.8.1 |
IBM Q Provider | 0.11.1 |
System information | |
Python | 3.9.1 (default, Dec 10 2020, 10:36:35) [Clang 12.0.0 (clang-1200.0.32.27)] |
OS | Darwin |
CPUs | 6 |
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.
[ ]: