Skip to main content
IBM Quantum Platform

동적 MPF

qiskit_addon_mpf.dynamic

동적 MPF 계수.

이 모듈은 동적(즉, 시간에 따라 달라지는) MPF 계수를 계산하기 위한 선형 방정식 시스템(LSE) 동적(즉, 시간에 따라 달라지는) MPF 계수를 계산할 수 있습니다.

setup_dynamic_lse

setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)

GitHub

동적 MPF 계수 계산을 위한 선형 방정식 시스템을 반환합니다.

이 함수는 DynamicMPF 알고리즘을 사용하여 그램 행렬의 구성 요소(LSE.A, MM [1과] [2에서] ) 및 오버랩 벡터(LSE.b, [1과] [2의] LL )를 주어진 시간 진화 매개변수에 대해 계산합니다.

그램 행렬( MijM_{ij} )과 오버랩 벡터( LiL_i )의 요소는 다음과 같이 정의됩니다

Mij=Tr(ρki(t)ρkj(t)),Li=Tr(ρ(t)ρki(t)),\begin{split}M_{ij} &= \text{Tr}(\rho_{k_i}(t)\rho_{k_j}(t)) \, , \\ L_i &= \text{Tr}(\rho(t)\rho_{k_i}(t)) \, ,\end{split}

여기서 ρ(t)\rho(t)tt 시점의 정확한 시간 진화 상태이고 ρki(t)\rho_{k_i}(t)kik_i 트로터 스텝을 사용하여 근사한 시간 진화 상태입니다.

MMLL 에서 동적(즉, 시간에 따라 달라지는) MPF 계수를 계산하는 것은 LSE (유사하게 static MPF 계수를 계산하는 방법과 유사)에 대한 해를 구하는 것이며, 모든 계수의 합이 1이어야 한다는 제약 조건( ixi=1\sum_i x_i = 1 )을 적용하지만 이 LSE에서는 (정적인 경우와 달리) 이 제약 조건이 적용되지 않습니다. 이 추가 제약 조건을 포함하는 최적화 문제는 문서화되어 있습니다 costs 모듈에 문서화되어 있습니다. [1과] [2에서] 제안한 것은 setup_frobenius_problem().

모든 요소 MijM_{ij}LiL_i 를 평가하려면 두 시간 진화 상태 간의 중첩을 계산해야 합니다. 알고리즘은 DynamicMPF 알고리즘은 선택적 종속성 중 하나에서 제공하는 텐서 네트워크 계산을 통해 이를 수행합니다. 사용 가능한 백엔드 목록과 자세한 설명은 backends 모듈에 자세히 설명되어 있습니다.

아래에서는 백엔드를 사용하는 예제를 제공합니다 quimb_tebd 백엔드를 사용한 예제를 제공합니다. 각 요소에 대해 간략하게 설명합니다.

먼저 시간 진화를 하고자 하는 간단한 하이젠베르크 해밀턴을 초기화합니다. 에 기반한 타임 에볼버를 사용하고 있으므로 quimb를 기반으로 하는 타임 에볼버를 사용하고 있으므로 해당 라이브러리를 사용하여 해밀턴도 초기화합니다.

>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)

다음으로 MPF를 구성하는 트로터 단계 수, 목표 진화 시간 및 초기 상태를 정의합니다(각각 [1의]ψin\psi_{in} 및 [2의] ψ0\psi_0 ) 를 사용하여 시간 진화 상태 간의 중첩을 계산합니다. 여기서는 간단히 Néel 상태를 사용하며, 이 상태는 또한 quimb:

>>> trotter_steps = [3, 4]
>>> time = 0.9
>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)

전체 알고리즘을 실행해야 하므로 DynamicMPF 알고리즘을 실행하여 MijM_{ij}LiL_i 의 모든 요소를 계산해야 하므로, 인스턴스의 입력 인수를 초기화하기 위해 DynamicMPF 인스턴스의 입력 인자를 초기화하기 위한 팩토리 메서드를 제공해야 합니다. 이를 위해 세 가지 기능을 제공해야 합니다. 이를 구성하기 위해 functools.partial() 함수를 사용합니다.

>>> from functools import partial

먼저 빈 시간 진화 상태를 초기화하는 함수가 필요합니다( DynamicMPF.evolution_state 참조). 이 생성자 함수는 위치나 키워드 인수를 받지 않을 수 있으며 반드시 State 객체를 반환해야 합니다.

>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))

두 번째와 세 번째 함수는 왼쪽과 오른쪽 시간 진화 엔진을 구성해야 합니다( DynamicMPF.lhsDynamicMPF.rhs 를 참조하세요.) 이러한 함수는 ExactEvolverFactoryApproxEvolverFactory 프로토콜을 따라야 합니다.

함수는 ExactEvolverFactory 함수는 State 객체를 유일한 위치 인자로 취해야 하며, 반환해야 하는 것은 Evolver 객체를 반환해야 하며, 이는 LiL_i 요소의 LHS를 계산하는 데 사용됩니다(즉, 정확한 시간 진화 상태인 ρ(t)\rho(t) )를 생성해야 합니다.

여기서는 0.05 의 작은 시간 단계를 사용하여 4차 스즈키-트로터 공식을 사용하여 정확한 시간 진화 상태를 근사화합니다. 또한 몇 가지 quimb-특정 절단 옵션을 지정하여 기본 텐서 네트워크의 최대 결합 차원과 분할 텐서 네트워크 결합의 최소 특이값을 제한할 수 있습니다.

>>> from qiskit_addon_mpf.backends.quimb_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     dt=0.05,
...     order=4,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

함수는 ApproxEvolverFactory 함수는 또한 State 객체를 유일한 위치 인수로 사용해야 하며, 시간 진화의 시간 단계를 지정하기 위해 dt 라는 키워드 인수를 추가로 사용해야 합니다. 또한 대략적인 시간 진화 상태를 생성하는 Evolver 객체를 반환해야 합니다( ρki(t)\rho_{k_i}(t), 여기서 kik_i 은 선택한 시간 단계( dt)에 의해 결정됩니다). 따라서 이러한 인스턴스는 MijM_{ij} 요소의 양쪽뿐만 아니라 LiL_i 요소의 RHS를 계산하는 데 사용됩니다.

여기에서는 이전과 동일한 잘림 설정으로 2 차 스즈키-트로터 공식을 사용합니다.

>>> approx_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     order=2,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

마지막으로, 초기화하고 setup_dynamic_lse() 함수를 초기화하고 실행하여 LSE 를 얻을 수 있습니다.

>>> from qiskit_addon_mpf.dynamic import setup_dynamic_lse
>>> lse = setup_dynamic_lse(
...     trotter_steps,
...     time,
...     identity_factory,
...     exact_evolver_factory,
...     approx_evolver_factory,
...     initial_state,
... )
>>> print(lse.A)  
[[1.         0.99998513]
 [0.99998513 1.        ]]
>>> print(lse.b)  
[1.00001585 0.99998955]

매개변수

  • trotter_steps (list[int]) – 사용할 트로터 단계의 순서를 지정합니다.
  • time (float) – 총 목표 진화 시간입니다.
  • identity_factory (IdentityStateFactory) – 빈 객체를 생성하는 함수 State 객체를 생성하는 함수입니다.
  • exact_evolver_factory (ExactEvolverFactory) – 인스턴스를 초기화하는 함수입니다 Evolver 인스턴스를 초기화할 수 있는 함수, ρ(t)\rho(t).
  • approx_evolver_factory (ApproxEvolverFactory) – 인스턴스를 초기화하는 함수 Evolver 인스턴스는 제공된 시간 단계에 따라 kik_i 의 다른 값에 대해 대략적인 시간 진화 상태( ρki(t)\rho_{k_i}(t) )를 생성하는 함수( dt)입니다.
  • initial_state (Any) – 의 요소 MijM_{ij} 를 계산할 초기 상태( ψin\psi_{in} 또는 ψ0\psi_0 )를 반환합니다 LSE.ALiL_i LSE.b. 이 객체의 유형은 이전 인수에 대해 선택한 텐서 네트워크 백엔드와 일치해야 합니다.

리턴

LSE 를 사용하여 위에서 설명한 대로 동적 MPF 계수를 찾을 수 있습니다.

리턴 유형

LSE

참조

[1] : S. 주크 외., 실제 Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

[2] : N. 로버트슨 외., arXiv:2407.17405v2 (2024).

https://arxiv.org/abs/2407.17405v2


공장 프로토콜

다음 프로토콜은 다양한 객체 팩토리 인자에 대한 함수 서명을 정의합니다.

IdentityStateFactory

class IdentityStateFactory(*args, **kwargs)

GitHub

베이스: Protocol

ID 인스턴스 구성을 위한 팩토리 함수 프로토콜 State 인스턴스를 생성하는 팩토리 함수 프로토콜입니다.

에서 자세히 설명한 것처럼 setup_dynamic_lse()에서 자세히 설명한 것처럼 이 팩토리 함수는 호출되어 DynamicMPF.evolution_state 를 ID 또는 빈 상태로 초기화합니다. 이 함수는 어떤 인자도 받지 않고 State 인스턴스를 반환해야 합니다.

ExactEvolverFactory

class ExactEvolverFactory(*args, **kwargs)

GitHub

베이스: Protocol

정확한 인스턴스를 생성하기 위한 팩토리 함수 프로토콜 Evolver 인스턴스를 생성하기 위한 팩토리 함수 프로토콜입니다.

에서 자세히 설명한 것처럼 setup_dynamic_lse()에서 자세히 설명한 것처럼 이 팩토리 함수는 호출되어 DynamicMPF.lhs 인스턴스 Evolver 요소를 계산할 때 정확한 시간 진화 상태인 ρ(t)\rho(t) 를 생성하는 LiL_i 의 인스턴스를 초기화하기 위해 호출됩니다.

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

베이스: Protocol

대략적인 인스턴스를 생성하기 위한 팩토리 함수 프로토콜입니다 Evolver 인스턴스를 생성하는 팩토리 함수 프로토콜입니다.

에서 자세히 설명한 것처럼 setup_dynamic_lse()에서 자세히 설명한 것처럼 이 팩토리 함수는 호출되어 DynamicMPF.rhs 인스턴스 Evolver 요소를 계산할 때 LiL_i 또는 양쪽(DynamicMPF.lhsDynamicMPF.rhs) 요소를 계산할 때 MijM_{ij} 의 인스턴스를 초기화합니다. 이러한 대략적인 시간 진화 상태는 트로터 단계( ρki(t)\rho_{k_i}(t) )에 따라 달라지므로 이 함수는 시간 진화의 시간 단계를 dt 이라는 키워드 인수로 제공해야 합니다.


핵심 알고리즘

DynamicMPF

class DynamicMPF(evolution_state, lhs, rhs)

GitHub

베이스: object

동적 MPF 알고리즘.

LHS 및 RHS로 인스턴스화된 Evolver 로 시작되는 이 알고리즘은 evolve() 공유 State 목표 진화 시간까지 공유합니다. 그 후 DynamicMPF.overlap()State 의 초기 상태를 계산할 수 있습니다. 보다 setup_dynamic_lse() 를 구성하는 MijM_{ij}LiL_i 요소를 계산하는 데 사용되는 방법에 대한 자세한 설명은 LSE 동적 MPF 계수를 구성합니다.

참조

[1] : S. 주크 외., 실제 Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

[2] : N. 로버트슨 외., arXiv:2407.17405 (2024).

https://arxiv.org/abs/2407.17405

인스턴스를 생성합니다 DynamicMPF 인스턴스를 생성합니다.

매개변수

  • evolution_state (State) – lHS 및 RHS 시간 진화 엔진이 공유할 상태입니다.
  • lhs (Evolver) – lHS 시간 진화 엔진.
  • rhs (Evolver) – rHS 시간 진화 엔진.

시간_소수점자리수

유형: int

기본값: 8

진화 시간 반올림에 사용되는 소수점 이하 자릿수입니다.

의 시간 진화 과정에서 evolution_state엔진의 진화 시간과 목표 진화 시간을 서로 비교하는 경우가 많습니다. 이 검사는 부동 소수점 숫자를 비교하며, 이 설정은 반올림할 소수점 이하 자릿수를 지정합니다.

evolution_state

LHS와 RHS 시간 진화 엔진 간에 공유되는 상태입니다.

evolve

evolve(time)

GitHub

제공된 시간까지 동적 MPF 알고리즘을 발전시킵니다.

이는 실제로 지정된 시간까지 LHS 및 RHS를 사용하여 시간 경과에 따라 DynamicMPF.evolution_state 지정된 시간까지 LHS 및 RHS Evolver 인스턴스를 사용합니다.

매개변수

time (float) – 총 목표 진화 시간입니다.

레이즈

RuntimeError - LHS와 RHS 진화 시간이 마지막에 같지 않은 경우.

리턴 유형

없음

lhs

LHS 시간 진화 엔진.

overlap

overlap(initial_state)

GitHub

의 중첩을 계산합니다 DynamicMPF.evolution_state 의 중첩을 계산합니다.

경고

제공된 initial_state 의 유형은 선택한 백엔드에 따라 달라집니다 StateEvolver 인스턴스에 제공된 DynamicMPF 인스턴스에 사용된 백엔드에 따라 달라집니다. 즉, 백엔드는 이 중복 계산을 위해 특정 유형의 initial_state 객체만 지원할 수 있습니다. 자세한 내용은 initial_state 인수에 대한 설명도 참조하세요 setup_dynamic_lse() 에 대한 설명을 참조하세요.

매개변수

initial_state (Any) – 중첩을 계산할 초기 상태입니다.

레이즈

TypeError - 제공된 초기 상태가 호환되지 않는 유형인 경우.

리턴

의 겹침 DynamicMPF.evolution_state 와 중복됩니다.

리턴 유형

복합체

rhs

RHS 시간 진화 엔진.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.