# 初期推定

分子と基底が揃いました。SCF が走る前に、**出発点** — 最初の Fock 行列を作るための近似密度 — が必要です。その
出発点が**初期推定（initial guess）**です。ふだんは意識しません:qc-rs が良い既定を自動で選びます。しかしこれを
理解しておくと、計算が*収束しにくい*ときにまさに効きます — そこでこの短い章では、推定とは何か、なぜ（ふつうは）
答えを変えないのか、そして必要なときにどう変えるかを説明します。

## 理論:なぜ SCF に推定が要るのか

[Hartree–Fock](../10-foundations/hartree-fock.md) の**自己無撞着場**ループを思い出しましょう。Fock 行列
$\mathbf F$ は密度 $\mathbf D$ から作られますが（クーロン・交換演算子 $\mathbf J[\mathbf D]$, $\mathbf K[\mathbf D]$
を通じて）、その密度は $\mathbf F$ を対角化して得られます。この循環 —

$$
\mathbf D \;\longrightarrow\; \mathbf F[\mathbf D]
\;\xrightarrow{\;\mathbf{FC}=\mathbf{SC}\boldsymbol\varepsilon\;}\; \mathbf C
\;\longrightarrow\; \mathbf D' \;\longrightarrow\; \cdots
$$

こそが SCF が**反復的**である理由です。しかしこれは同時に、ループが*最初の*一歩を踏み出すにも既に密度が手元に
必要だ、ということを意味します。**初期推定**がその出発点 $\mathbf D_0$（または出発軌道の組）を与えます。

要点はこうです。SCF は**不動点** — 自己無撞着な密度 — へ収束し、行儀のよい系ではその不動点は*どこから出発したか
に依りません*。だから:

:::{important} 推定は*経路*を変え、*目的地*を変えない
初期推定が違っても**収束エネルギーは同じ**です;変わるのは**サイクル数**だけ（そして難しい系では**収束するか
どうか**）。最終密度に近い推定は速く収束し、粗い推定は多くのサイクルを要します。安い推定と引き換えに精度を失う
ことはありません — 速さと頑健さだけの話です。
:::

これは下の総合例で直接*見え*ます:水に対する 6 通りの推定はすべて $-76.026794\,E_h$ に着地し、8〜12 サイクルを
要します。

## 既定:SAD

qc-rs の既定は**原子密度の重ね合わせ（SAD）**です。考え方は物理的で安価:分子の密度は一次近似では、*原子の密度を
重ねただけ*、というものです。SAD は各元素の球平均密度を（小さな原子 SCF から）あらかじめ計算し、核位置で足し合わせて
$\mathbf D_0$ を作ります。既に持っている以上の分子積分を必要とせず、周期表全体で頑健で、たいてい数サイクルで収束
するほど十分近いのです。

自分で要求する必要はありません。[中核概念](../00-intro/concepts.md) で述べたとおり、SCF が出発状態を必要とし、
それが存在しないとき `run()` は `sad` 推定を**自動挿入**します。（原子密度を作れない場合 — 未表化の元素や ECP のみの
重原子 — SAD は `gwh`、次に素の内殻ハミルトニアンへフォールバックします。）

## 推定のメニュー

既定は `guess("...")` で上書きできます。利用できる推定を、最も物理的なものから最も粗いものへ、下の例で
水/cc-pvdz（RHF）に要したサイクル数とともに示します:

| `guess(...)` | 何をするか | サイクル* |
|---|---|---|
| `"sad"` *(既定)* | 原子密度の重ね合わせ — 頑健・物理的 | 9 |
| `"minao"` | 固定した最小 AO 占有密度（PySCF `minao`）;**原子 SCF なし**なので SAD より安い | 9 |
| `"harris"` | Harris 汎関数密度（非自己無撞着な重ね合わせ） | 8 |
| `"sap"` | 原子*ポテンシャル*の重ね合わせ（$\mathbf F = \mathbf H_{\text{core}} + \mathbf J[\mathbf D_{\text{SAD}}]$、クーロンのみ） | 10 |
| `"gwh"` | 一般化 Wolfsberg–Helmholz（内殻ハミルトニアンから）;**ECP 対応** | 12 |
| `"core"` | 素の内殻ハミルトニアン $\mathbf T + \mathbf V$ — 電子間相互作用を*一切*無視;最も粗い | 11 |
| `"read"` | 別のチェックポイントから軌道を取り込み/射影（リスタート） | — |

*サイクル数は**系依存**です — 普遍的な順位づけと読まないでください。水では近接していますが、難しい系ではその
広がり（そしてどの推定が勝つか）は大きく違いえます。要点は、すべてが同じエネルギーに達することです。

## 理論:`gwh` と `sap` が実際に計算するもの

`core` と `gwh` は**二電子積分を一切必要としない**2 つの推定です — $\mathbf J,\mathbf K$ を一度作ることさえ
避けたいとき、または ECP 安全な普遍的フォールバック（後述）として有用です。`core` は単に素の一電子ハミルトニアン
$\mathbf H_{\text{core}}=\mathbf T+\mathbf V$ を対角化します — 形は正しいですが、電子間反発を完全に無視するので
軌道の出発点としては貧弱です。

**GWH**（一般化 Wolfsberg–Helmholtz）は、**重なり行列**と原子軌道エネルギーの表だけから作る半経験的な
*非対角*補正でこれを補います — やはり二電子積分は不要です:

$$
H_{\mu\nu}^{\mathrm{GWH}}
=
\begin{cases}
\epsilon_\mu & \mu=\nu, \\[4pt]
K_{\mathrm{GWH}}\, S_{\mu\nu}\, \dfrac{\epsilon_\mu+\epsilon_\nu}{2} & \mu\ne\nu,
\end{cases}
\qquad
\mathbf H^{\mathrm{GWH}}\mathbf C=\mathbf S\mathbf C\boldsymbol\varepsilon .
$$

$\epsilon_\mu$ は元素×角運動量の表（H–Ar）から取る原子価軌道エネルギーで、表にない AO は素の対角
$H^{\text{core}}_{\mu\mu}$ にフォールバックします。qc-rs は $K_{\mathrm{GWH}}=1.75$ を固定します（文献の範囲は
$1.5$–$2.0$）。直観としては:強く重なり*かつ*近いエネルギーにある 2 つの AO は強く結合すべきであり、これが
まさにこの非対角項が作るもの — 素の内殻ハミルトニアンには見えない結合の最初の手がかりを固有ベクトルに与えます。

**SAP**（原子ポテンシャルの重ね合わせ）はもう一歩進み、SAD 密度からの電子反発を折り込みます — クーロンのみで
交換なし:

$$
\mathbf F^{\mathrm{SAP}} = \mathbf H_{\text{core}} + \mathbf J[\mathbf D_{\text{SAD}}].
$$

$\mathbf J[\cdot]$ は密度に**線形**なので、$\mathbf J[\mathbf D_{\text{SAD}}] = \sum_A \mathbf J[\mathbf D_A]$
— Fock 様演算子は*まさに*各原子自身の Hartree ポテンシャルの和で、これが「原子ポテンシャルの重ね合わせ」の
名の由来です。コストはクーロン構築 1 回分だけ（交換も自己無撞着も不要なので、完全な SCF サイクルより安い）で、
上の表の DIIS を 1〜2 サイクル削るのに十分近い推定を買えます（`gwh` の 12 に対し 10）。

## 使い方

よくあるのは**何もしない**こと — `run()` に SAD を挿入させます。上書きするには、SCF の前に `guess` ステップを
足します（他のステップと同じく、関数形式でもメソッドチェーン形式でも）:

```python
import qc
water = "O 0 0 0.117; H 0 0.757 -0.469; H 0 -0.757 -0.469"

# 明示的な推定（メソッドチェーン）
mychk = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom").guess("gwh").scf(ref="r").run()

# 同等の関数形式
base  = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom")
mychk = qc.scf(qc.guess(base, "gwh"), ref="r").run()
```

### 前の結果からリスタート:`guess("read")`

`guess("read", source=...)` は別のチェックポイントから軌道を取り込み、現在の基底へ射影します。日常の 2 つの用途:

- 保存した `.qch5` からの**リスタート** — 続きを計算する、または既存の SCF に対して物性を再計算する。
- **基底のステップアップ** — 小さな基底で安く収束させ、*その結果を推定として*大きな基底の SCF に渡す。すると
  高価なサイクルがずっと少なくて済みます:

```python
small = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom").scf(ref="r").run()
small.save("water_dz.qch5")

big = qc.chk.new(atom=water, ao="cc-pvtz", unit="angstrom") \
        .guess("read", source="water_dz.qch5").scf(ref="r").run()
```

`read` の詳細（MO 射影、対称性/既約表現の扱い）はチェックポイントのリファレンス
[qc-chk.md](../40-reference/checkpoints.md) にあります。

## 推定が本当に効くとき

日常の閉殻分子では既定でうまくいきます。推定が注意に値するのは 3 つの場合です:

- **収束しにくい系** — 遷移金属、準縮退、ジラジカル。より良い推定（または関連計算からの `read`）が、滑らかな
  収束と、振動する SCF との分かれ目になりえます。[SCF の章](scf.md) の収束ツールと併用してください。
- **ECP 基底** — 原子重ね合わせ推定（`sad`/`sap`/`harris`）は**全電子**で、ECP 原子に誤った価電子数を置いて
  しまうので、qc-rs は自動的に **`gwh` へ降格**します（価電子のみの内殻ハミルトニアン
  $\mathbf T + \mathbf V_{\text{nuc}}[Z_{\text{eff}}] + \mathbf V^{\text{ECP}}$ を対角化）。`gwh` と `core` は
  そのまま ECP 対応です。
- **対称性の破れ・励起状態** — UHF ジラジカルは空間対称性を破るのに `guess(..., spin_break="mix")` を要する
  ことが多く、ΔSCF 励起状態は**非 Aufbau 占有**（`mom=True` と `guess(..., occupation=...)`）を要します。
  これらは [SCF の章](scf.md) で扱います。

## 総合例:同じエネルギー、異なるサイクル数

本章の考え全体が 1 つのスクリプトに:どの推定も同一のエネルギーに収束しますが、SCF サイクル数は変わります:

```python
import qc
water = "O 0 0 0.117; H 0 0.757 -0.469; H 0 -0.757 -0.469"

for g in ("sad", "minao", "harris", "sap", "core", "gwh"):
    chk = qc.chk.new(atom=water, ao="cc-pvdz", unit="angstrom").guess(g).scf(ref="r").run()
    print(f"{g:8}  E = {chk.scf.energy:.6f}   cycles = {chk.scf.ncycle}")

# sad       E = -76.026794   cycles = 9
# minao     E = -76.026794   cycles = 9
# harris    E = -76.026794   cycles = 8
# sap       E = -76.026794   cycles = 10
# core      E = -76.026794   cycles = 11
# gwh       E = -76.026794   cycles = 12
```

エネルギーはビット単位で同一で、動くのは `cycles` の列だけです。これが推定の唯一の仕事です:*出発点*を決めるので
あって、*答え*を決めるのではありません。

:::{exercise}
:label: ex-guess

1. 実行せずに、同じ分子・基底で `guess("core")` と `guess("sad")` から得られる収束 RHF エネルギーはどうなると
   予想しますか。なぜですか。
2. 同じ分子に対し `cc-pvqz`（高価な基底）で 50 回の SCF を回す必要があります。各回のサイクルを減らすため、
   `guess("read")` を使う戦略を描きなさい。
3. 重金属錯体に ECP 基底を与え、`guess("harris")` を要求しました。qc-rs は実際に何を使い、それはなぜですか。
:::

:::{solution} ex-guess
:class: dropdown

1. **同じエネルギー。** SCF は推定に依らず同じ不動点へ収束します;`core` はそこへ着くのに単に多くのサイクルを
   要するだけです（電子間相互作用を完全に無視するので、真値から遠くから出発します）。
2. より安い基底（例 `cc-pvdz`）または近い構造で**一度**収束させ、`save()` し、それを `cc-pvqz` 計算の
   `guess("read", source=...)` として渡します — すると各高価な SCF は、ほぼ収束した密度から出発し、その高コストな
   サイクルがずっと少なくて済みます。
3. **`harris` を `gwh` へ降格**します。`harris`（`sad`/`sap` と同様）は全電子の原子重ね合わせ推定で、ECP 原子に
   誤った価電子数を割り当ててしまいます;`gwh` は価電子のみの ECP 内殻ハミルトニアンから作られ、正しいのです。
:::

分子・基底・出発点が定まったので、いよいよ **SCF 本体** — 参照法・汎関数・収束ツール — を [次章](scf.md) で扱えます。
