Portuguese
Idiomas
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

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]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_1_0.png

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]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_5_0.png

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]:
../../_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])

circ.draw("mpl")
[5]:
../../_images/tutorials_circuits_advanced_07_pulse_scheduler_9_0.png

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]:
../../_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.filter(channels=[pulse.DriveChannel(0), pulse.DriveChannel(1)]).draw()
[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
qiskit-terra0.20.2
qiskit-aer0.10.4
qiskit-ignis0.7.1
qiskit-ibmq-provider0.19.1
qiskit0.36.2
System information
Python version3.9.9
Python compilerGCC 11.1.0
Python buildmain, Dec 29 2021 22:19:36
OSLinux
CPUs32
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.