프로토콜
이 모듈은 패키지 전반에 걸쳐 사용되는 다양한 프로토콜을 제공합니다.
A는 클래스가 이를 명시적으로 상속받지 않더라도 구조적으로 구현할 수 있는 인터페이스입니다 typing.Protocol . 예를 들어, 어떤 __len__ 메서드를 구현하는 클래스는 그 클래스 계층 구조의 어느 곳에도 명시되어 있든 없든 상관없이 해당 조건을 만족합니다 Sized.
이 모듈에 포함된 프로토콜들은 모두 같은 개념을 따르지만, 각각은 그 자체로는 특별할 것 없는 단일한 ‘dunder’ 스타일 메서드(예: _majorana_operator_)를 중심으로 합니다. 해당 메서드를 구현하는 클래스는 그로 인해 (SupportsMajoranaOperator 이 예시에서) 해당 프로토콜을 준수하게 되며, 별도의 명시적 등록 절차 없이도 해당 프로토콜이 요구되는 모든 곳에서 사용할 수 있게 됩니다. “프로토콜”이라는 용어는 때때로 인터페이스 그 자체를 가리키는 것이 아니라, 프로토콜을 기반으로 구축된 타입에 구애받지 않는 디스패치 함수(예: fermion_operator())를 지칭하는 데 광범위하게 사용되기도 하므로, 문맥을 통해 이 구분을 명확히 파악해야 합니다.
아래의 일부 프로토콜에는, 전달된 객체가 무엇이든 해당 객체의 프로토콜 메서드로 호출을 전달하는, 타입에 구애받지 않는 작은 헬퍼 함수가 함께 제공됩니다.
프로토콜 | 방법 | 헬퍼 함수 |
|---|---|---|
SupportsFermionOperator | _fermion_operator_(self) | fermion_operator() |
SupportsMajoranaOperator | _majorana_operator_(self) | majorana_operator() |
SupportsApplyUnitaryPlaced | _apply_unitary_placed_(self, vec, norb, nelec, copy, freg_indices) | – |
SupportsCommutators | _commutator_, _anti_commutator_, _double_commutator_ (모두 @staticmethod) | commutator(), anti_commutator(), double_commutator() |
칼럼 1 | 칼럼 2 |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | .의 패키지별 확장 기능 ffsim.SupportsApplyUnitary. |
SupportsCommutators(*args, **kwargs) | 효율적인 커뮤테이터 생성을 지원하는 프로토콜. |
SupportsFermionOperator(*args, **kwargs) | 이 패키지의 연산자 변환 계약은 연산자를 FermionOperator.로 변환합니다. |
SupportsMajoranaOperator(*args, **kwargs) | 마요라나 연산자를 대상으로 하는 해당 SupportsFermionOperator 프로토콜의 등가물. |
ffsim에서 구현된 프로토콜
시뮬레이션은 ffsim의 담당 분야이며, 관련 프로토콜은 이곳에서 다시 설명하기보다는 ffsim에서 정의되어 있습니다. 이 패키지의 게이트와 오퍼레이터는 다음을 구현하므로, ffsim의 디스패처가 이를 직접 수용합니다:
ffsim 프로토콜 | 방법 | 다음에 의해 구현됨 |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit 그리고 모든 FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator 이 _fermion_operator_ 메서드 이름은 이 패키지의 메서드 이름과 동일하지만 SupportsFermionOperator, 두 계약은 서로 다릅니다. 즉, 이 메서드는 ffsim의 관련 없는 유형 FermionOperator 대신 이 패키지의 유형을 반환합니다. 이 메서드는 순전히 메서드 이름만을 기준으로 ffsim.fermion_operator() 호출되므로, 이 패키지의 객체에 대해 이 메서드를 호출하면 해당 타입이 반환됩니다.