Dynamics Simulator - Q-CTRL Fire Opal의 Qiskit Function
API 레퍼런스를 참조하세요.
Qiskit Functions는 IBM Quantum® Premium Plan, Flex Plan, On-Prem(IBM Quantum Platform API를 통한) Plan 사용자에게만 제공되는 실험적 기능입니다. 미리 보기 릴리스 상태이며 변경될 수 있습니다.
개요
Q-CTRL Dynamics Simulator는 지원되는 양자 다체 모델의 시간 발전을 IBM Quantum 하드웨어에서 시뮬레이션하기 위한 애플리케이션 Qiskit Function입니다. 양자 회로를 직접 구성하는 대신 물리 모델, 초기 상태, 시간 발전 파라미터, 측정할 관측값을 지정합니다.
이 함수는 필요한 동적 회로를 구성하고 실행하며 Fire Opal의 하드웨어 인식 최적화 및 오류 억제 워크플로를 적용합니다. 결과는 요청한 관측값의 기댓값에 대한 시간 추이입니다. 이 함수는 오류 억제를 자동으로 적용하므로 기록적인 깊이의 회로를 실행하면서도 의미 있는 신호를 확인할 수 있습니다. Dynamics Simulator는 기존 최첨단 고전 도구와 일치하는 해의 정확도를 제공하며 속도 면에서 입증 가능한 이점을 제공합니다.
실제 환경 테스트에서 최고 해상도의 고전 텐서 네트워크 시뮬레이션과 비교했을 때 평균 제곱근 오차(RMSE) 1% 이내의 일치를 달성했습니다. 연구 커뮤니티의 독립적인 테스트는 양자 컴퓨터가 Q-CTRL의 초기 시연을 넘어서도 정확성을 유지한다는 것을 검증했습니다.
벤치마크
사이트 수는 필요한 큐비트 수를 결정하고, Trotter 단계 수는 시간 발전 회로의 깊이를 제어합니다. 각 격자 사이트는 스핀 업과 스핀 다운 점유를 나타내기 위해 두 개의 큐비트를 사용합니다.
이 워크플로는 Trotter 단계 30개로 60개 사이트(120큐비트)의 체인, 그리고 Trotter 단계 90개로 31개 사이트(62큐비트)의 체인에 대해 시연되었습니다. 아래 표는 회로당 20,000 shot으로 IBM® Heron r3(ibm_boston) 장치에서 수행된 보고된 실험의 회로 리소스와 QPU 실행 시간을 보여 줍니다.
| 시스템 크기 | Trotter 단계 | 2큐비트 깊이 | 2큐비트 게이트 수 | QPU 시간 | REM + DR 포함 QPU 시간 |
|---|---|---|---|---|---|
| 10 사이트(20큐비트) | 30 | 152 | 1,457 | 2m 46s | 4m 25s |
| 10 사이트(20큐비트) | 60 | 302 | 2,897 | 5m 36s | 8m 42s |
| 10 사이트(20큐비트) | 90 | 452 | 4,337 | 8m 46s | 13m 26s |
| 31 사이트(62큐비트) | 30 | 152 | 4,649 | 2m 46s | 4m 25s |
| 31 사이트(62큐비트) | 60 | 302 | 9,239 | 5m 36s | 8m 42s |
| 31 사이트(62큐비트) | 90 | 452 | 13,829 | 8m 46s | 13m 26s |
| 60 사이트(120큐비트) | 30 | 152 | 9,057 | 2m 46s | 4m 25s |
Trotter 단계 수가 고정되어 있으면, 보고된 회로 깊이와 QPU 시간은 테스트한 시스템 크기에 관계없이 동일하게 유지되는 반면 2큐비트 게이트 수는 증가합니다. 단계 수를 늘리면 더 깊은 회로가 만들어지고 더 많은 QPU 시간이 필요합니다.
여기서 QPU 시간은 주요 시뮬레이션 회로의 누적 하드웨어 실행 시간입니다. 마지막 열에는 판독 오류 완화(REM)와 붕괴 복구(DR)에 사용되는 노이즈 특성화의 QPU 시간도 포함됩니다. 이 가이드는 작은 1차원 Fermi-Hubbard 예제를 사용하여 모델 정의부터 측정된 동역학 플로팅까지의 전체 워크플로를 보여 줍니다.
함수 설명
양자 동역학은 양자 시스템이 시간에 따라 어떻게 변하는지를 설명합니다. 이러한 발전을 연구하면 입자가 어떻게 움직이는지, 상관관계가 어떻게 발전하는지, 그리고 시스템이 상태나 해밀토니언의 변화에 어떻게 반응하는지 이해하는 데 도움이 됩니다.
Fermi-Hubbard 모델은 격자 사이트 사이를 이동하며 같은 사이트를 차지할 때 상호작용하는 페르미온을 설명합니다. 호핑과 상호작용 사이의 경쟁 때문에 강하게 상관된 전자를 연구하는 데 유용한 모델입니다. 이 모델의 시간 발전은 스핀과 전하가 어떻게 전파되는지, 그리고 처음에 정렬된 시스템이 어떻게 이완되는지를 보여 줄 수 있습니다.
모델
Dynamics Simulator는 열린 경계를 가진 1차원 Fermi-Hubbard 체인을 지원합니다. 개 사이트의 체인에 대해 해밀토니언은 다음과 같이 정의됩니다.
여기서 와 는 사이트 에서 스핀 를 가진 페르미온을 생성하고 소멸시킵니다. 수 연산자 는 해당 스핀 궤도의 점유를 측정합니다.
모델 입력은 다음 계수를 지정합니다.
-
hopping_amplitude: 이웃한 사이트 와 사이의 호핑을 제어하는 입니다. -
on_site_interaction: 같은 사이트를 차지하는 스핀 업과 스핀 다운 페르미온 사이의 상호작용인 입니다. -
chemical_potential: 해밀토니언에 음의 부호로 들어가는 국소 화학 퍼텐셜인 입니다.
체인 전체에 동일한 계수를 사용하려면 스칼라를 제공하고, 개별 결합이나 사이트에 계수를 지정하려면 리스트를 제공하세요.
인 단위에서 초기 상태는 다음과 같이 발전합니다.
이 함수는 지정한 관측값의 기댓값을 연속된 시뮬레이션 시간마다 추정합니다.
워크플로
이 함수의 워크플로는 다음 단계로 구성됩니다.
-
알고리즘 합성: 이 함수는 해밀토니언과 시뮬레이션 시간 설정을 사용하여 최적화된 Trotter-Suzuki 시퀀스를 구성하며, 시뮬레이션 정확도를 고려하면서 회로 깊이를 줄입니다.
-
하드웨어 인식 매핑: 이 함수는 선택한 IBM Quantum 백엔드의 큐비트 연결성과 오류 특성을 사용하여 회로를 매핑하고 라우팅합니다.
-
물리 계층 오류 억제: Fire Opal은 동적 디커플링과 펄스 수준 보정을 적용하여 하드웨어 실행 중 환경으로 인한 노이즈와 크로스토크를 억제합니다.
이 함수는 이러한 단계를 자동으로 관리하고 요청한 관측값의 기댓값을 시간에 따라 반환합니다.
함수 입력을 통해 물리적 문제와 시뮬레이션 설정을 정의합니다. 현재 인터페이스는 Trotter 시간 발전을 지원하며, time_step은 각 단계의 지속 시간을, step_count는 단계 수를 설정합니다.
자세한 내용은 Fire Opal dynamics simulator 개요와 simulate_dynamics API 레퍼런스를 참조하세요.
시작하기
이 Qiskit Function에 대한 액세스 정보는 Qiskit Functions Catalog에서 확인하세요.
이 가이드는 Dynamics Simulator를 로드하고 4개 사이트의 Fermi-Hubbard 체인을 시뮬레이션하는 방법을 보여 줍니다. 다음 코드는 IBM Quantum Platform API 키와 인스턴스 CRN을 로컬 환경에 이미 저장했다고 가정합니다.
계정 설정 및 클라이언트 설치 방법은 Qiskit Functions 시작하기를 참조하세요.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qctrlvisualizer": "qctrlvisualizer", "qiskit_ibm_catalog": "qiskit-ibm-catalog"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# Access the Q-CTRL Dynamics Simulator Qiskit Function.
sim_qf = catalog.load("q-ctrl/dynamics-simulator")
# Check the list of backends you have access to
catalog.backends()
[<IBMBackend('ibm_boston')>,
<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_kingston')>,
<IBMBackend('ibm_marrakesh')>,
<IBMBackend('ibm_miami')>,
<IBMBackend('ibm_phoenix')>,
<IBMBackend('ibm_pittsburgh')>]
# Select the backend you want to use
backend = catalog.backend("ibm_phoenix")
예제: 4개 사이트 Fermi-Hubbard 체인 시뮬레이션
호핑 진폭 , 사이트 내 상호작용 없음, 화학 퍼텐셜 0인 4개 사이트의 1차원 Fermi-Hubbard 체인을 생각해 보세요. 스핀 업 페르미온 하나가 사이트 0에서 시작하여 체인을 따라 발전합니다.
이 작은 문제는 Dynamics Simulator 워크플로에 초점을 맞추게 해 줍니다.
-
모델과 시뮬레이션을 정의합니다.
-
초기 상태와 관측값을 정의합니다.
-
Qiskit Function 작업을 제출합니다.
-
기댓값을 가져옵니다.
-
동역학을 플로팅합니다.
1. 문제 정의
site_count = 4
model = {
"hopping_amplitude": 1.0,
"on_site_interaction": 0.0,
"chemical_potential": 0.0,
}
simulation = {
"time_step": 0.2,
"step_count": 8,
}
initial_state = "eeeu"
observables = [
{
"operators": [[["Nup", site]]],
"coefficients": [1.0],
}
for site in range(site_count)
]
shot_count = 2048
관측값 리스트는 스핀 업 점유를
각 사이트에서 측정합니다. 관측값은 제공된 순서와 같은 순서로 반환됩니다.
2. 동역학 시뮬레이션 실행
Qiskit Function을 통해 문제를 제출하세요. Qiskit Functions Catalog가 IBM Quantum 인증을 처리하므로 sim_qf.run()에 Fire Opal이나 하드웨어 공급자의 자격 증명을 별도로 전달하지 않습니다.
job = sim_qf.run(
model=model,
simulation=simulation,
observables=observables,
initial_state=initial_state,
shots=shot_count,
backend_name=backend.name,
)
print(job.job_id, job.status())
68202fad-6919-425d-8fd2-c1c649cd15b1 DONE
반환되는 객체는 Qiskit Function 작업입니다. 작업 ID를 보관해 두면 나중에 워크로드를 조회하거나 검사할 수 있습니다.
3. 결과 가져오기
result = job.result()
print("Result keys:", sorted(result.keys()))
print("Warnings:", result.get("warnings", []))
Result keys: ['metadata', 'observable_expectation_values', 'observables', 'warnings']
Warnings: []
관측값 기댓값을 NumPy 배열로 변환합니다. 각 행은 하나의 관측값에 해당하고 각 열은 에서 시작하는 기록된 시뮬레이션 시간에 해당합니다. 이 예제에서 네 개의 행은 사이트 0부터 3까지의 스핀 업 점유를 담고 있습니다.
import numpy as np
expectation_values = np.asarray(
result["observable_expectation_values"],
dtype=float,
)
print("Expectation-value array shape:", expectation_values.shape)
Expectation-value array shape: (4, 9)
4. 동역학 시각화
초기 상태에는 스핀 업 페르미온이 하나 있고 스핀 다운 페르미온은 없습니다. 따라서 이 상태의 발전은 단일 입자 부분 공간에 머무르며, 그 네 개의 기저 상태는 페르미온이 사이트 0, 1, 2, 3을 차지하는 경우에 해당합니다.
이 부분 공간에서 해밀토니언은 호핑 진폭 로 이웃한 사이트를 연결합니다. 여기에 사용된 파라미터에서는 다음과 같습니다.
NumPy로 이 행렬을 대각화하고 Dynamics Simulator가 반환한 것과 같은 시간에서 초기 상태를 발전시키세요. 각 상태 진폭의 제곱 크기는 해당 사이트의 스핀 업 점유를 나타냅니다.
이 계산은 정확한 해밀토니언 발전을 제공합니다. 하드웨어 추정값과 이 기준값 사이의 차이에는 유한한 Trotter 단계, 측정 통계, 잔여 하드웨어 오류가 포함될 수 있습니다.
times = np.arange(expectation_values.shape[1]) * simulation["time_step"]
# This reference is specific to a single spin-up fermion.
if (
len(initial_state) != site_count
or initial_state.count("u") != 1
or initial_state.count("e") != site_count - 1
):
raise ValueError(
"This reference requires one spin-up fermion and otherwise empty sites."
)
# Build the Hamiltonian in the single-particle subspace.
hamiltonian = -model["hopping_amplitude"] * (
np.eye(site_count, k=1) + np.eye(site_count, k=-1)
)
hamiltonian -= model["chemical_potential"] * np.eye(site_count)
# The rightmost character of initial_state corresponds to site 0.
initial_amplitudes = np.zeros(site_count, dtype=complex)
initial_site = initial_state[::-1].index("u")
initial_amplitudes[initial_site] = 1.0
# Evolve the initial state in the Hamiltonian eigenbasis.
energies, eigenvectors = np.linalg.eigh(hamiltonian)
initial_coefficients = eigenvectors.conj().T @ initial_amplitudes
phases = np.exp(-1j * np.outer(energies, times))
states = eigenvectors @ (initial_coefficients[:, None] * phases)
ideal_expectation_values = np.abs(states) ** 2
사이트마다 하나의 패널을 플로팅하세요. 실선 곡선은 기록된 시간에서의 정확한 기준값을 나타내고, 마커는 Dynamics Simulator가 반환한 하드웨어 추정값을 나타냅니다.
import matplotlib.pyplot as plt
import qctrlvisualizer as qv
from qctrlvisualizer import QCTRL_STYLE_COLORS as colors
plt.style.use(qv.get_qctrl_style())
fig, ax = plt.subplots(figsize=(10, 6))
for site in range(len(expectation_values)):
site_color = colors[site % len(colors)]
ax.plot(
times,
ideal_expectation_values[site],
color=site_color,
linewidth=2,
label=f"Site {site}: exact reference",
)
ax.plot(
times,
expectation_values[site],
color=site_color,
linestyle="--",
linewidth=1.5,
marker="o",
markersize=5,
label=f"Site {site}: hardware estimate",
)
ax.set_xlim(times[0], times[-1])
ax.set_ylim(-0.05, 1.05)
ax.set_xlabel(r"Time (units of $\hbar/t_h$)")
ax.set_ylabel(r"$\langle n_{i\uparrow} \rangle$")
ax.set_title("Spin-up occupation dynamics")
ax.legend(
ncol=2,
fontsize=10,
loc="best",
)
fig.tight_layout()
plt.show()

에서 정확한 스핀 업 점유는 사이트 0에서 1이고 다른 사이트에서는 0입니다. 시스템이 발전함에 따라 호핑이 체인 전체에 입자의 확률을 퍼뜨립니다. 사이트 1의 점유가 가장 먼저 증가하고, 이어서 사이트 2와 3의 점유가 증가합니다. 이 예제의 파라미터에서 마지막으로 기록된 시간은 입니다. 사이트 0부터 3까지의 정확한 점유는 각각 약 0.026, 0.370, 0.392, 0.211입니다.
정확한 점유는 모든 시간에서 다음 식을 만족하며, 이는 입자 수 보존을 반영합니다.
입자가 유한한 체인을 따라 발전하면서 개별 사이트의 점유는 오르내릴 수 있습니다.
오류 메시지 가져오기
워크로드가 ERROR 상태가 되면 job.result()를 호출하여 오류 메시지를 확인하세요. 함수 로그를 사용할 수 있는 경우 로그를 확인할 수도 있습니다.
print(job.status())
if job.status() == "ERROR":
print(job.result())
print(job.logs())
DONE
일반적인 입력 검증 문제로는 지원되지 않는 모델 또는 시뮬레이션 방법, 너무 긴 초기 상태 문자열, 일치하지 않는 observable 항과 계수, 초기 상태 문자열 밖의 사이트를 참조하는 observable 등이 있습니다.
지원 받기
Dynamics Simulator 또는 Fire Opal의 동작에 관한 질문은 Q-CTRL 문서를 참조하거나 Q-CTRL에 문의하세요.
Qiskit Functions 인증, 작업 관리 또는 IBM Quantum Platform 액세스에 관해서는 Qiskit Functions 문서를 참조하세요.
다음 단계
- 기반이 되는 모델, 시뮬레이션, observable, 출력 및 검증 정의는
simulate_dynamicsAPI 참조를 확인하세요. - Fermi-Hubbard 모델의 스핀 및 전하 동역학 튜토리얼을 실습해 보세요.
- Trotterization, 하드웨어 인식 매핑, Fire Opal 오류 억제에 대한 자세한 내용은 Fire Opal 동역학 시뮬레이터 개요를 읽어 보세요.
- 모델 파라미터, 초기 상태, 시간 간격, 단계 수, observable을 수정하여 다른 1차원 Fermi-Hubbard 동역학 문제를 연구해 보세요.