@@ -1828,4 +1828,273 @@ PLAN.mdのPhase 4(コアライブラリ基盤)のVMC計算エンジン統合
18281828- 設定ファイル変換の修正
18291829- ビルド成功とヘルプコマンド動作確認
18301830
1831- これにより、** 完全なVMC計算システム** が確立され、基本的なVMC計算が実行可能な状態になりました。次のステップとして、並列化基盤の実装や高度な機能の追加が可能です。
1831+ これにより、** 完全なVMC計算システム** が確立され、基本的なVMC計算が実行可能な状態になりました。次のステップとして、並列化基盤の実装や高度な機能の追加が可能です。
1832+
1833+ ---
1834+
1835+ # Critical Issue Log - VMC計算が実際には動作していない (2025-10-02)
1836+
1837+ ## 問題の発覚
1838+
1839+ ** 日時:** 2025-10-02
1840+
1841+ ** 検証方法:**
1842+ - C実装の参照結果(` examples/CImplementationReferenceHeisenbergChain/output/zvo_out_001.dat ` )と比較
1843+ - デバッグ出力を追加して実行時の内部状態を確認
1844+
1845+ ** 症状:**
1846+ ```
1847+ # Rust実装の出力(全て0)
1848+ 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 ...
1849+ 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 ...
1850+ (500行すべて同じ)
1851+
1852+ # C実装の参照出力(単調減少して収束)
1853+ -1.328846153846154e+00 0.000000000000000e+00 2.359119415073651e-03 ...
1854+ -1.330295190656816e+00 0.000000000000000e+00 1.993041654143447e-03 ...
1855+ -1.331244314868805e+00 0.000000000000000e+00 1.801301050889120e-03 ...
1856+ ```
1857+
1858+ ## デバッグ出力から判明した問題
1859+
1860+ ``` rust
1861+ DEBUG : First config - spin_config : [Down ] // ❌ 1サイトしかない(4サイト必要)
1862+ DEBUG : u8_config : [2 ] // ❌ 1要素のみ
1863+ DEBUG : psi : 1 + 0i , norm : 1 // ❌ 常に1(計算されていない)
1864+ DEBUG : local_energy : 0 + 0i // ❌ 常に0(ハミルトニアンが呼ばれていない)
1865+ DEBUG : total_energy : 0 + 0i , total_weight : 1000 , average : 0 + 0i
1866+ ```
1867+
1868+ ## 根本原因の分析
1869+
1870+ ### 1. 電子配置の生成が根本的に間違っている
1871+
1872+ ** 問題箇所:** ` crates/mvmc-core/src/vmc/engine.rs:electron_config_to_spin_config() `
1873+
1874+ ``` rust
1875+ fn electron_config_to_spin_config (& self , config : & ElectronConfiguration ) -> Vec <Spin > {
1876+ // ❌ 問題: 最初の1サイトしか見ていない
1877+ let spin_up = config . spin_up ();
1878+ let spin_down = config . spin_down ();
1879+
1880+ if spin_up > 0 {
1881+ vec! [Spin :: Up ] // ❌ 1要素のベクターを返している
1882+ } else if spin_down > 0 {
1883+ vec! [Spin :: Down ] // ❌ 1要素のベクターを返している
1884+ } else {
1885+ vec! [Spin :: Empty ] // ❌ 1要素のベクターを返している
1886+ }
1887+ }
1888+ ```
1889+
1890+ ** 正しい実装(C実装を参考に):**
1891+ - 全サイト(nsite個)のスピン状態を保持する必要がある
1892+ - 各サイトは ` Up ` , ` Down ` , ` Empty ` のいずれかの状態
1893+ - C実装では ` eleIdx[Ne] ` と ` eleSpn[Ne] ` で電子の位置とスピンを表現
1894+
1895+ ### 2. ElectronConfigurationの設計が不適切
1896+
1897+ ** 問題箇所:** ` crates/mvmc-core/src/monte_carlo/metropolis.rs:ElectronConfiguration `
1898+
1899+ ``` rust
1900+ pub struct ElectronConfiguration {
1901+ sites : Vec <usize >, // ❌ サイトのインデックスのみ(全サイトの状態を保持していない)
1902+ spin_up : usize , // ❌ up/downの総数だけで個別のサイト情報がない
1903+ spin_down : usize ,
1904+ }
1905+ ```
1906+
1907+ ** 正しい設計(C実装を参考に):**
1908+ ``` c
1909+ // C実装: global.h
1910+ int *eleIdx; // 電子のサイトインデックス [Ne]
1911+ int *eleSpn; // 電子のスピン(0:up, 1:down) [Ne]
1912+
1913+ // または、全サイトのスピン状態を保持
1914+ // Spin[Nsite]: 各サイトのスピン状態(Empty, Up, Down)
1915+ ```
1916+
1917+ ### 3. 波動関数が初期化されていない
1918+
1919+ ** 問題箇所:** ` crates/mvmc-physics/src/wavefunction/mod.rs:CombinedWavefunction `
1920+
1921+ ``` rust
1922+ impl CombinedWavefunction {
1923+ pub fn new (nsite : usize , ne : usize ) -> Self {
1924+ Self {
1925+ slater : None , // ❌ Noneのまま
1926+ pfaffian : None , // ❌ Noneのまま
1927+ projectors : Vec :: new (), // ❌ 空のまま
1928+ nsite ,
1929+ ne ,
1930+ }
1931+ }
1932+
1933+ pub fn calculate (& self , config : & [u8 ]) -> Result <Complex64 > {
1934+ // ❌ slaterがNoneなので常に1.0を返す
1935+ let mut amplitude = Complex64 :: new (1.0 , 0.0 );
1936+
1937+ if let Some (slater ) = & self . slater {
1938+ amplitude *= slater . calculate (config )? ;
1939+ }
1940+ // slaterがNoneなので上のブロックは実行されない
1941+
1942+ Ok (amplitude ) // ❌ 常に1.0
1943+ }
1944+ }
1945+ ```
1946+
1947+ ** 正しい初期化(C実装を参考に):**
1948+ - Slater行列式を平面波基底で初期化
1949+ - C実装の ` makeInitialSample() ` や ` makeInitialSlaterElm() ` を参考に
1950+
1951+ ### 4. ハミルトニアンの局所エネルギー計算が呼ばれていない
1952+
1953+ ** 問題箇所:** ` crates/mvmc-core/src/vmc/engine.rs:calculate_vmc_local_energy() `
1954+
1955+ ``` rust
1956+ fn calculate_vmc_local_energy (& self , spin_config : & [Spin ]) -> Result <f64 > {
1957+ // 対角エネルギーを計算
1958+ let mut local_energy = self . hamiltonian. diagonal_element (spin_config );
1959+
1960+ // 非対角項の追加を試みる
1961+ let nsite = spin_config . len ();
1962+
1963+ for i in 0 .. nsite {
1964+ for j in 0 .. nsite {
1965+ if i != j {
1966+ // ❌ 隣接判定やホッピングの実装が不完全
1967+ // この部分が正しく動作していない
1968+ }
1969+ }
1970+ }
1971+
1972+ Ok (local_energy )
1973+ }
1974+ ```
1975+
1976+ ** 正しい実装(C実装を参考に):**
1977+ - C実装の ` CalculateHamiltonian() ` を詳細に分析
1978+ - 対角要素と非対角要素の両方を正確に計算
1979+ - 波動関数振幅比 ` ψ(j)/ψ(i) ` を計算
1980+
1981+ ### 5. SR最適化が完全にコメントアウトされている
1982+
1983+ ** 問題箇所:** ` crates/mvmc-core/src/vmc/engine.rs:run_single_iteration() `
1984+
1985+ ``` rust
1986+ pub fn run_single_iteration (& mut self ) -> Result <VmcIterationResult > {
1987+ // サンプリング
1988+ let sampling_result = self . sampler. sample (& self . wavefunction)? ;
1989+
1990+ // エネルギー計算
1991+ let energy = self . calculate_energy (& sampling_result . configurations)? ;
1992+ let variance = self . calculate_variance (& sampling_result . configurations, energy )? ;
1993+
1994+ // ❌ 最適化がコメントアウトされている
1995+ // if let Some(optimizer) = &mut self.optimizer {
1996+ // let opt_result = optimizer.optimize(...)?;
1997+ // // パラメータ更新
1998+ // }
1999+
2000+ Ok (VmcIterationResult {
2001+ energy ,
2002+ variance ,
2003+ // ...
2004+ })
2005+ }
2006+ ```
2007+
2008+ ** 正しい実装:**
2009+ - SR最適化を実際に実行
2010+ - パラメータを更新して波動関数に反映
2011+ - これによりエネルギーが反復ごとに変化する
2012+
2013+ ## 実装上の学び
2014+
2015+ ### 誤った仮定
2016+ 1 . ** 「テストが通れば実装は正しい」** - 実際にはテストがモックデータで通っていただけ
2017+ 2 . ** 「型が合えば動く」** - 型安全性は重要だが、アルゴリズムの正しさは別問題
2018+ 3 . ** 「段階的実装で最後に統合すれば良い」** - 各コンポーネントが正しく連携していないと意味がない
2019+
2020+ ### 正しいアプローチ
2021+ 1 . ** C実装の詳細な分析を最初に行う** - アルゴリズムの完全な理解
2022+ 2 . ** 小さい系でエンドツーエンドテスト** - 2サイト系から始めて動作確認
2023+ 3 . ** デバッグ出力を最初から入れる** - 内部状態の可視化
2024+ 4 . ** C実装との結果比較を頻繁に行う** - 各ステップで検証
2025+
2026+ ### C実装の必読箇所
2027+
2028+ 1 . ** 電子配置とサンプリング:**
2029+ - ` mVMC/src/mVMC/vmcmake.c:VMCMakeInitial() ` - 初期配置の生成
2030+ - ` mVMC/src/mVMC/vmccal.c:VMCMakeSample() ` - モンテカルロサンプリング
2031+ - ` mVMC/src/mVMC/global.h:eleIdx, eleSpn ` - 電子配置の表現
2032+
2033+ 2 . ** 波動関数:**
2034+ - ` mVMC/src/mVMC/slater.c:UpdateSlaterElm() ` - Slater行列の更新
2035+ - ` mVMC/src/mVMC/slater.c:makeInitialSlaterElm() ` - Slater行列の初期化
2036+ - ` mVMC/src/mVMC/vmcmake.c:CalculateMAll() ` - 波動関数振幅の計算
2037+
2038+ 3 . ** エネルギー計算:**
2039+ - ` mVMC/src/mVMC/vmccal.c:CalculateHamiltonian() ` - ハミルトニアンの計算
2040+ - ` mVMC/src/mVMC/vmccal.c:VMCCalcEnergyDiff() ` - エネルギー差の計算
2041+
2042+ 4 . ** 最適化:**
2043+ - ` mVMC/src/mVMC/vmcmain.c:optimization_loop() ` - SR法の実装
2044+ - ` mVMC/src/mVMC/stcopt_main.c ` - SR法の詳細
2045+
2046+ ## 次のアクション
2047+
2048+ ### 緊急対応(Phase 8)
2049+
2050+ 1 . ** C実装の完全な分析** (1-2日)
2051+ - 上記の必読箇所を詳細に読む
2052+ - アルゴリズムのフローチャートを作成
2053+ - データ構造の対応表を作成
2054+
2055+ 2 . ** 電子配置の正しい実装** (1日)
2056+ - ` ElectronConfiguration ` の再設計
2057+ - 全サイトの状態を保持する構造に変更
2058+ - C実装の ` eleIdx ` , ` eleSpn ` との対応
2059+
2060+ 3 . ** 波動関数の初期化** (1日)
2061+ - Slater行列式の正しい初期化
2062+ - 平面波基底の実装
2063+ - 振幅計算の実装
2064+
2065+ 4 . ** 局所エネルギー計算** (1-2日)
2066+ - ハミルトニアンの行列要素の正確な計算
2067+ - 対角・非対角要素の実装
2068+ - 波動関数振幅比の計算
2069+
2070+ 5 . ** SR最適化の実装** (1-2日)
2071+ - 最適化ループの実装
2072+ - パラメータ更新の実装
2073+ - 収束判定の実装
2074+
2075+ 6 . ** 検証とデバッグ** (2-3日)
2076+ - 2サイト系でのテスト
2077+ - 4サイト系でのテスト
2078+ - C実装との詳細な比較
2079+
2080+ ** 推定所要時間:** 7-12日
2081+
2082+ ## 教訓
2083+
2084+ 1 . ** 「動いているように見える」≠「正しく動いている」**
2085+ - 出力ファイルが生成されても、中身が正しいとは限らない
2086+ - 参照実装との比較が不可欠
2087+
2088+ 2 . ** 物理計算の実装は型システムだけでは保証できない**
2089+ - Rustの型安全性は重要だが、アルゴリズムの正しさは別次元の問題
2090+ - 物理的な妥当性の検証が必須
2091+
2092+ 3 . ** 段階的実装の罠**
2093+ - 各モジュールが独立してテストされていても、統合すると動かない
2094+ - エンドツーエンドテストを早期に実施すべき
2095+
2096+ 4 . ** C実装の理解が最優先**
2097+ - Rustで綺麗に書き直そうとする前に、C実装を完全に理解する
2098+ - アルゴリズムの正確な移植が第一優先
2099+
2100+ この問題により、** Phase 4(コアライブラリ基盤)とPhase 7(CLI基盤)は「形式的には完了」しているが「実質的には未完成」** であることが明らかになった。Phase 8として、VMC計算の完全な再実装が必要である。
0 commit comments