UCC
class UCC(uccsd_op)
ベース: FermionicGate
ユニタリー結合クラスター単一・二重(UCCSD)アンザッツを実装しています。
単一の結合クラスター演算子は、以下の形式をとる
が占有され、 が仮想軌道であり、このゲートが包み込む演算子によって与えられる振幅 および を持つ。
この演算子自体は ffsimによって構築されており、このゲートによってそれが.に変換されます FermionicCircuit。 この分業は意図的なものです。ffsimはアンザッツ数学(振幅の規約や、変分最適化アルゴリズムが駆動するパラメータベクトルのパッキング)を担当し、一方、このゲートは結果をフェルミオンモードとして表現するため、トランスパイラーは任意のフェルミオンからクビットへのエンコーディングを通じてこれを低位化することができます。 ffsimはUCCSD向けのQiskitゲートを一切提供していないため、UCCSDオペレーターから回路へ接続するには、これが唯一の手段となります。 詳細はffsimのリレーションシップガイドを参照してください。
ffsimの4つのUCCSD演算子のいずれかを受け付けます。その型によって、このゲートが作用するスピンバリアントとモード数が決まります。 これら4つすべてが 2 * norb ブロックスピンモード(モードα p はアルファ軌道 p、モードβ norb + p はベータ軌道 p)に作用し、占有軌道が仮想軌道よりも先に並んでいる:
UCCSDOpRestrictedRealまた、両方のスピンセクター間で1つの空間パラメータ化を共有UCCSDOpRestrictedする: は形状t1を持ち、(nocc, nvrt)は形状t2を持つ(nocc, nocc, nvrt, nvrt)。UCCSDOpUnrestrictedRealそして、スピンセクターを独立にパラメータUCCSDOpUnrestricted化します。はペアでありt1、(t1a, t1b)``t2は三重項です(t2aa, t2ab, t2bb)。
クラスター演算子は、同一スピンの ブロックのうち、 同時交換 に対して対称な部分のみを扱う。これは、基礎となる励起 が、ペア のラベル付けを変更しても不変であるためである。結合クラスター振幅( PySCF, または ffsim 独自のものを参照 uccsd_generator_restricted())は常にこの対称性を有しているため、このゲートと ffsim はこの点において完全に一致する。 これがない t2 場合の手作業による構築は、対称化された対応物と同じアプローチをここで示しているのに対し、ffsimは生のテンソルを読み取ります。
とは異なり UCJ、このアンザッツにはそれ自体による最終的な軌道回転は含まれていない。その の振幅がすでに単一励起を提供しているため、後続の回転は冗長な自由度となるからである。 ffsim の演算子では final_orbital_rotation; が公開されており、これが設定されている場合、このゲートはそれを閉じ括弧として追加します OrbitalRotation。
の個々の励起項は可換でないため、この definition() ゲートが生成する回路は、指数関数の 1次積公式 (トロッター)近似であり、厳密な分解ではない(UCCアンザッツ回路では通常そうである)。 対照的に、状態ベクトルシミュレーション法(_apply_unitary_placed_())では、 scipyの を通じて指数関数を厳密に適用する expm_multiply。 その結果、シミュレーションされたゲートとその合成回路は、トロッター誤差の範囲内でのみ一致する。これを縮小するには、トランスパイレーションの際に高次の積公式を使用すること。
ffsimは(無条件の PySCF 依存関係のため)Windowsをサポートしていないため、このゲートでは ffsim extra (pip install "qiskit-fermions[ffsim]")が必要となり、Windowsでは利用できません。 Windowsで WSL を使用します。
これは初期の開発プロトタイプです。 このパッケージのプレリリース開発期間中、予告なしにインターフェースが変更される可能性があるため、ご注意ください。
>>> import ffsim
>>> import numpy as np
>>> from qiskit_fermions.circuit.library import UCC
>>> uccsd_op = ffsim.UCCSDOpRestrictedReal(
... t1=np.zeros((1, 1)), t2=np.zeros((1, 1, 1, 1))
... )
>>> gate = UCC(uccsd_op)
>>> gate.norb, gate.num_modes
(2, 4)
このゲートのインスタンスの初期化は、以下に挙げる引数を使用して行うことができます。
パラメーター
uccsd_op (Any) – 回路を構築するための ffsim UCCSD オペレータ。これには、 UCCSDOpRestrictedRealUCCSDOpRestricted、または UCCSDOpUnrestrictedReal のいずれかを使用します UCCSDOpUnrestricted。 その型によってスピンバリアントが決まります(クラスのドキュメント文字列を参照してください)。
昇給
- MissingOptionalLibraryError –
ffsimがインストールされていない場合。 - TypeError – が ffsim の 4 種類の UCCSD 演算子タイプのいずれにも該当
uccsd_opしない場合。
属性
norb
空間軌道の数。
uccsd_op
このゲートが回路を構成するために使用するffsim UCCSD演算子。
方法
cluster_operator
cluster_operator()
反エルミートクラスター生成関数 を返します。
このジェネレーターは、ブロック・スピンモードの表記法で表されている(モード p はアルファ軌道 p、モード norb + p はベータ軌道 p)。 占有軌道は、仮想軌道よりも先に並列される。
この生成子は反エルミートであるため、アンザッツのユニタリー演算子とは、 という関係にあり、エルミート演算子 とも関係している。 こそが「消費 Evolution 」するものであり、これはユニタリー演算子を生成するためにエルミート演算子が必要となるためであり、また、これがアンザッツを表現 _build_definition() する方法でもある。
返される演算子は、その groups ペアのすべての励起とそのエルミート共役を格納します。 このグループ分けは負荷保持的である:グループごとに分解 Evolution されるため、各グループは積の式における一つの因数 となり、 を乗じると、各グループが個別にエルミート性を持つようになる――したがって、すべての因数が真のユニタリとなる。 その代わりに項ごとに分割しても、うまくいかないでしょう(以下のコメントを参照)。
戻り値
クラスタジェネレータ は、. として機能します FermionOperator。
戻りの型
プロトコルの方法
_apply_unitary_placed_
_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)
そのモードをベクトルのグローバルモードに割り当てた後、そのアンザッツを適用します。
これにより、ゲートの定義(クラスター演算子の遷移)が構築され、それが に適用されます vec。この際、定義回路はグローバルモード上に配置されます freg_indices。 定義における単一の はクラスター生成子全体を包含 Evolution しているため、それ自体が( scipyを介して expm_multiply)それを正確に指数 _apply_unitary_placed_ 関数的に表現する――したがって、この経路では、合成回路とは異なり、トロッター誤差は生じない。 正確なゲートシーケンス _define() については、こちらを参照してください。
パラメーター
- vec (ndarray) – 作用させる状態ベクトル。
- norb (int) – グローバル状態ベクトルの空間軌道数。
- nelec (int |tuple[int, int]) – スピンを持たない系の場合は単一の整数、あるいはスピンαおよびスピンβのフェルミオンの数を表す整数のペアのいずれか。
- copy (bool) – 操作を行う前にベクトルをコピーするかどうか。
- freg_indices (list[int]) – このゲートのローカルモードが写像される絶対(グローバル)モードのインデックス。
戻り値
変換後のベクトル。
戻りの型