Skip to content

Commit 4971b9e

Browse files
Implement basic features
1 parent 076aeea commit 4971b9e

25 files changed

+3861
-374
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

IMPLEMENTATION_LOG.md

Lines changed: 270 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)