Parameter의 Builder 구문 활용
개시하다
Builder 문법은 Parameter 등급과 함께 위력을 발휘하는 문법이다.이 기사에서 나는 파라메터반의 Builder 문장을 사용하는 작법을 소개하고 싶다.
먼저 Qiskit Pulse를 이동하기 위해 필요한 기술을 요약합니다.import numpy as np
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.visualization import *
from qiskit.circuit import Gate
from qiskit.circuit import Parameter
from qiskit import pulse
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
backend = provider.get_backend('ibmq_armonk')
backend_defaults = backend.defaults()
backend_config = backend.configuration()
Parameter 클래스의 Builder 구문 사용
Parameter 클래스는 변수 매개변수에 사용되는 클래스입니다.
이것만 있으면 잘 모르겠어요. 그래서 제가 원본 코드를 쓸게요.
Qiskit Textbook의 주파수 교정 소스 코드를 예로 들어 소개하고 싶습니다.import numpy as np
GHz = 1.0e9 # Gigahertz
MHz = 1.0e6 # Megahertz
# サンプル数は16の倍数である必要があります
def get_closest_multiple_of_16(num):
return int(num + 8 ) - (int(num + 8 ) % 16)
qubit=0
mem_slot=0
# 1 周波数領域の決定
center_frequency_Hz = backend_defaults.qubit_freq_est[qubit]
frequency_span_Hz = 40 * MHz
frequency_step_Hz = 1 * MHz
frequency_min = center_frequency_Hz - frequency_span_Hz / 2
frequency_max = center_frequency_Hz + frequency_span_Hz / 2
frequencies_GHz = np.arange(frequency_min / GHz,
frequency_max / GHz,
frequency_step_Hz / GHz)
# 2 パルスに必要な値の設定
drive_sigma_sec = 0.075e-6
drive_duration_sec = drive_sigma_sec * 8
drive_amp = 0.05
# 3 Parameterクラスの定義
freq = Parameter('freq')
# 4 Builder構文
with pulse.build(backend=backend, default_alignment='sequential') as parametrized_sched:
# 5 Parameterクラスで定義した変数を周波数に設定
pulse.set_frequency(freq, pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=get_closest_multiple_of_16(pulse.seconds_to_samples(drive_duration_sec)),
amp=drive_amp,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name='spect_pulse'), pulse.drive_channel(qubit))
pulse.measure(qubits=[qubit], registers=[pulse.MemorySlot(mem_slot)])
# 6 周波数領域とParameterクラスを使って定義したScheduleをバインド
frequencies_Hz = frequencies_GHz*GHz
schedules = [parametrized_sched.assign_parameters({freq: f}, inplace=False) for f in frequencies_Hz]
schedules[0].draw(backend=backend)
import numpy as np
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.visualization import *
from qiskit.circuit import Gate
from qiskit.circuit import Parameter
from qiskit import pulse
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
backend = provider.get_backend('ibmq_armonk')
backend_defaults = backend.defaults()
backend_config = backend.configuration()
import numpy as np
GHz = 1.0e9 # Gigahertz
MHz = 1.0e6 # Megahertz
# サンプル数は16の倍数である必要があります
def get_closest_multiple_of_16(num):
return int(num + 8 ) - (int(num + 8 ) % 16)
qubit=0
mem_slot=0
# 1 周波数領域の決定
center_frequency_Hz = backend_defaults.qubit_freq_est[qubit]
frequency_span_Hz = 40 * MHz
frequency_step_Hz = 1 * MHz
frequency_min = center_frequency_Hz - frequency_span_Hz / 2
frequency_max = center_frequency_Hz + frequency_span_Hz / 2
frequencies_GHz = np.arange(frequency_min / GHz,
frequency_max / GHz,
frequency_step_Hz / GHz)
# 2 パルスに必要な値の設定
drive_sigma_sec = 0.075e-6
drive_duration_sec = drive_sigma_sec * 8
drive_amp = 0.05
# 3 Parameterクラスの定義
freq = Parameter('freq')
# 4 Builder構文
with pulse.build(backend=backend, default_alignment='sequential') as parametrized_sched:
# 5 Parameterクラスで定義した変数を周波数に設定
pulse.set_frequency(freq, pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=get_closest_multiple_of_16(pulse.seconds_to_samples(drive_duration_sec)),
amp=drive_amp,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name='spect_pulse'), pulse.drive_channel(qubit))
pulse.measure(qubits=[qubit], registers=[pulse.MemorySlot(mem_slot)])
# 6 周波数領域とParameterクラスを使って定義したScheduleをバインド
frequencies_Hz = frequencies_GHz*GHz
schedules = [parametrized_sched.assign_parameters({freq: f}, inplace=False) for f in frequencies_Hz]
schedules[0].draw(backend=backend)
sweep할 주파수를 설정합니다.여기
backend_defaults
에서 중심 주파수의 값을 얻었다.펄스에 필요한 값을 설정합니다.
Parameter 클래스를 정의합니다.여기에 변수값
freq
을 클래스에 넘깁니다.Builder 구문을 사용하여 Schedule을 작성합니다.
를 사용하여 Schedule에서 사용되는 빈도를 정의합니다.여기서는 실제 값을 정의하는 것이 아니라 Parameter 클래스를 정의합니다.
실제 주파수 값을 Schedule과 연관시킨 것은 이번이 처음입니다.
freq = Parameter('freq')
amp = Parameter('amp')
with pulse.build(backend=backend, default_alignment='sequential') as parametrized_sched2:
pulse.set_frequency(freq, pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=get_closest_multiple_of_16(pulse.seconds_to_samples(drive_duration_sec)),
amp=amp,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name='spect_pulse'), pulse.drive_channel(qubit))
pulse.measure(qubits=[qubit], registers=[pulse.MemorySlot(mem_slot)])
편리한 점을 말씀드리자면, 여기 정의된 Schedule은 비슷한 실험에서 사용할 수 있습니다.예를 들어 낮은 에너지와 높은 에너지로 웨이브를 스캔하려면 아래와 같이 위의 Schedule "parametrized sched2"를 다시 이용할 수 있다.# 周波数領域と振幅(low power)をParameterクラスを使って定義したScheduleとバインド
frequencies_Hz = frequencies_GHz*GHz
schedules = [parametrized_sched2.assign_parameters({freq: f, amp: 0.1}, inplace=False) for f in frequencies_Hz]
# 周波数領域と振幅(high power)をParameterクラスを使って定義したScheduleとバインド
frequencies_Hz = frequencies_GHz*GHz
schedules = [parametrized_sched2.assign_parameters({freq: f, amp: 1.0}, inplace=False) for f in frequencies_Hz]
총결산
이 글은 파라메터를 활용한 Builder 문법을 소개한다.Parameter 클래스를 사용하면 Schedule을 for문에 넣어 원본 코드를 명확하게 할 수 있습니다.또한 변수는 제어 프로세스(Schedule)와 별도로 정의할 수 있기 때문에 Schedule을 사용하여 순환하고 재사용성이 높아진다.
Reference
이 문제에 관하여(Parameter의 Builder 구문 활용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kumezawa/items/1d85f83a401c71a6cf31
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Parameter의 Builder 구문 활용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kumezawa/items/1d85f83a401c71a6cf31텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)