Nota
Esta página foi gerada a partir de tutorials/circuits_advanced/07_pulse_scheduler.ipynb.
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]:

We’ll use the mocked backend, FakeHanoi
, to demonstrate how to use the scheduler. It contains default calibrations for measurement and for its basis gates. The Hadamard operation is not one of those basis gates, so we use the transpiler to compile our input circuit to an equivalent circuit in terms of the basis gates of the device.
[2]:
from qiskit import transpile, schedule as build_schedule
from qiskit.providers.fake_provider import FakeHanoi
backend = FakeHanoi()
transpiled_circ = transpile(circ, backend) # Undefined Hadamard is replaced by U1
schedule = build_schedule(transpiled_circ, backend)
Let’s see how our schedule schedule
built from the circuit transpiled_circ
looks.
[3]:
schedule.draw()
[3]:

That covers the basics! We used the transpiler to rewrite the circuit in terms of the basis gates, and then used the backend’s default calibrations to schedule the transpiled circuit. Next we will go through scheduling with calibrations we will build ourselves.
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()
[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])
circ.draw("mpl")
[5]:

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.filter(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)]).draw()
[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.filter(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)]).draw()
[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-terra | 0.20.2 |
qiskit-aer | 0.10.4 |
qiskit-ignis | 0.7.1 |
qiskit-ibmq-provider | 0.19.1 |
qiskit | 0.36.2 |
System information | |
Python version | 3.9.9 |
Python compiler | GCC 11.1.0 |
Python build | main, Dec 29 2021 22:19:36 |
OS | Linux |
CPUs | 32 |
Memory (Gb) | 125.64827728271484 |
Wed Sep 21 09:33:41 2022 EDT |
This code is a part of Qiskit
© Copyright IBM 2017, 2022.
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.