fix: use residual stopping for FEAST eigenanalysis

This commit is contained in:
KOKO\Mimi
2026-09-10 01:52:49 +09:00
parent 76192508fd
commit 7ebdce373c
12 changed files with 209 additions and 17 deletions
@@ -1,12 +1,81 @@
# MITC4 eigen 구현 및 실행 결과
- Feature: `mitc4-shell-feast-eigen2`; Owner: 메인 assistant; 2026-09-09 KST.
- 판정: **구현 진행분 보존, 기능 acceptance 미완료**. 시간 제한으로 중지한 작업이 아니다.
- Feature: `mitc4-shell-feast-eigen2`; Owner: 메인 assistant; 갱신 2026-09-10 KST.
- 현재 판정: **FEAST 잔차 초과 해소, 외부 Value 비교와 기능 acceptance 미완료**.
아래 2026-09-10 결과가 최신이며 2026-09-09 trace 실행은 당시 evidence로 보존한다.
- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[정식화](formulation.md), [수치 controls](numerical-review-controls.md), [I/O](io.md).
- 독립 검토: [수치](implementation-numerical-review.md),
[S3 정적 계약](implementation-numerical-review-s3-static.md),
[물리](implementation-physics-review.md).
[물리](implementation-physics-review.md), [FEAST 종료 변경](implementation-feast-residual-review.md).
## 2026-09-10 FEAST residual stopping 변경 결과
[ADR-011](ADR.md#mfe2-adr-011--feast-residual-stopping과-s3-후속-분리)의 사용자 승인에 따라 backend의 C-index
`fpm[5]`만 `1→0`으로 변경하고 HDF5 writer의 실제 control 검증도 `0`으로 맞췄다.
`fpm[2]=12`, `[3]=20`, seed/thread/구간/capacity/실패 정책과 모든 독립 tolerance는 유지했다.
S3, K/M·질량 축소·회복 수식, reference artifact는 변경하지 않았다.
새 테스트는 실제 backend snapshot과 저장한 HDF5의 `[5]=0`을 확인하고 trace 값으로
변조한 candidate를 거부하면서 기존 최종 파일을 보존하는지 검사한다. 변경 전 `[5]=1`
때문에 두 검사가 실패한 뒤 최소 source 수정으로 통과했다.
| 실행 | 결과 |
| --- | --- |
| 변경 전 backend/HDF5 focused CTest | 2/2 실패, `[5]=1` 확인. `.harness/feast-residual-red.log` |
| MSVC x64 Debug 3개 test target build | exit0, 새 compiler warning 없음 |
| 변경 후 backend/writer/원본 reference focused CTest | 12개 중 11 통과, exit1. 영·혼합 영·반복·근접 고유값, thread 복원, control readback/변조 거부 통과. 원본은 해석 성공 후 외부 Value 비교에서 실패 |
| `python scripts/execute.py` | build 성공, runner exit1 / CTest exit8. **395개 중 394 통과**, 원본 Value reference 1개 실패. 178.42초; unit320, integration42, reference33 |
| 공식 HDF5 read-only 추출 | 전체 c개 metric과 실제 controls·backend call·10개 Value를 확인. Focused와 full 실행의 modes/vectors/eigenpair_checks/base_fpm dataset bytes 동일 |
전체 실행은 `.harness/feast-residual-full-run.log`, 상세 CTest는
`.harness/feast-residual-full-ctest.log`, focused는 `.harness/feast-residual-focused.log`다.
Read-only 추출 스크립트와 JSON은 최종적으로 ignored build directory에 보관했다.
재현 명령은 `uv run --with h5py python .harness/build-ninja-msvc-debug/extract_feast_residual.py`이며,
그 directory의 `feast-residual-metrics.json`과 `feast-residual-full-metrics.json`이 각 실행의 기록이다.
개인 환경·추출 스크립트·기계 생성 로그/결과는 커밋하지 않는다. 이 작업에서 Python Harness suite는 실행하지 않았다.
원본 [결과 HDF5](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_results.h5)는
이번 실제 해석이 새로 생성한 공식 sibling output이다. 생성과 closed-file self-check는 성공했고,
기존 외부 INP/TXT의 실행 전후 bytes는 reference test에서 보존을 확인했다.
| Metric | 새 결과 |
| --- | ---: |
| 요청 N / 계산 c / m0 | 10 / 22 / 33 |
| Count / solve calls | 25 / 1 |
| FEAST info / loop | 0 / 6 (기존 trace는 4회) |
| 전체 c 최대 rho_B | `1.605467212112365e-13` |
| 최대 original-free eta_r / whitened eta_w | `9.981033437726324e-15` / `7.315529163435965e-15` |
| eta_gram / max_eta_orth | `1.3777964580680282e-15` / `1.6958335496991244e-15` |
| 최대 backend_res | `8.280018892001454e-13` |
| epsout (trace 변화 진단량) | `2.4227135616446226e-17` |
전체 22개는 각각 독립 `1e-10` 기준을 통과한다. 기존 실패 column20의
`rho_B=1.48674481038207483e-10` 대비 같은 column의 잔차가 약926배 감소했다.
기존 trace 진단에서 추출한 첫10개 Value 대비 새 Value의 최대 상대 변화는 약`2.74e-14`다.
따라서 이 개선은 고유쌍의 대수적 잔차 개선이며 외부 reference와의 일치를 보장하지 않는다.
| Mode | FESA Value (표시 반올림) | Abaqus Value | 상대오차 / singleton RMS (%) |
| --- | ---: | ---: | ---: |
| 1 | 218267.149475 | 219507 | 0.564834 |
| 2 | 873571.591115 | 885523 | 1.349644 |
| 3 | 873571.591115 | 885523 | 1.349644 |
| 4 | 1816890.360227 | 1855340 | 2.072377 |
| 5 | 2669030.373076 | 2740230 | 2.598308 |
| 6 | 2703557.194039 | 2775150 | 2.579781 |
| 7 | 4013818.213002 | 4149410 | 3.267737 |
| 8 | 4013818.213002 | 4149410 | 3.267737 |
| 9 | 6446840.913563 | 6733790 | 4.261331 |
| 10 | 6446840.913563 | 6733790 | 4.261331 |
모드별 singleton family와 [공통 tolerance](../TOLERANCE.md)를 그대로 적용했다.
모든 행은 상대오차5% 이내지만 Mode2–10은 RMS1%를 초과하여 blocking FAIL이다.
이는 이전에는 residual 실패 때문에 도달하지 못했던 비교 결과다. 원인은 이번 변경에서
확정하지 않았으며 질량·drilling 정식화나 tolerance를 결과에 맞춰 수정하지 않았다.
독립 수치 검토는 이번 종료 제어 변경을 PASS로 판단했으나 외부 acceptance는 FAIL로 구분했다.
S3의 알려진 실패와 아래 기존 세부 coverage 제한도 남는다.
## 2026-09-09 trace stopping 구현 이력
## 구현된 경로
@@ -95,11 +164,12 @@ Newton tangent/objectivity/energy/rollback와 pressure synthetic 검사는 초
full-row-sum mutation, C06 이종 section 공유 node mass assembly, C21/22의 vendor-status/
budget/allocation 실패 주입 전체, C24의 close/replace 실패 주입 전체는 추가 evidence가 필요하다.
## 사용자 결정이 필요한 후속 작업
## 2026-09-09 당시 후속 제안
현재 요구·정식화·NR·I/O의 수치를 구현 결과에 맞춰 조용히 바꾸지 않는다.
[프로젝트 지침](../../AGENTS.md)의 Physics/지원 범위/acceptance 변경 및 미해결 필수 계약 충돌
경계에 따라 다음 재검토를 제안한다. 아래는 **미승인 제안**이다.
경계에 따라 다음 재검토를 제안했다. 당시에는 **미승인 제안**이었으며,
이후 1번의 residual stopping만 ADR-011로 승인·실행했다. 2번 S3는 사용자 요청으로 후속 검토한다.
1. `rho_B<=1e-10`과 전체 c 검증을 유지하면서 FEAST 종료 제어를 재검토한다.
`fpm[5]=0` residual stopping은 검토 후보이며, actual runtime·zero/repeated/endpoint/