Files
VesiscanClinicalAndroid/app/src
dw.jang 31527830e5 fix(bv): estimateBv + adaptive_large_bladder_relax + b_si_floor — BV Δ 0.000 mL
Python `runners.estimate_bv` 완전 이식으로 single-trace BV 를 Python 과
**bit-perfect** 매칭. 그동안 발견되지 못한 근본 원인은:

1) `_apply_urine_inset_one` (LUMEN_INSET_FRAC=0.15) — Kotlin 호출자에서
   미적용. 이전 commit db64407 에서 subsample refined 만 이식하고 inset 은
   건너뜀. Python 은 fit 전에 walls 를 lumen 안쪽으로 15% 이동 후 int round.
2) `adaptive_large_bladder_relax` wrapper (runners.py:180) — Kotlin 자체가
   이 wrapper 를 이식 안 함. Python 은 첫 계산 후 low_wide_endpoint 조건
   (endpoint 단면이 넓지만 cap 낮음) 만족 시 `urine_inset_frac=0.05` +
   `b_si_floor_ratio=0.85` 로 재실행. 이 케이스에서 b_si_floor 가 발동해
   b_si_ellipse 를 강제 상향 (43 → 47 mm) → cap 부피 크게 증가.
3) `b_si_floor_ratio` (bv_estimation.py:1316-1321) — ellipse fit 성공 block
   에서 자유 b_si 붕괴 방지 로직. Kotlin 미이식.

주요 변경:
- managers/PiezoBVEstimator.kt
  * `WallWithSpan` data class 신규 (Python extract_walls 4-tuple 대응)
  * `estimateBv(walls, hw, ..., adaptiveLargeBladderRelax=true)` 신규 — Python
    runners.estimate_bv 1:1. low_wide_endpoint 검사 + retry 로직.
  * `estimateBladderVolume6ch` Double 오버로드 : bSiFloorRatio,
    bSiFloorEdgeMin 파라미터 추가.
  * `estimateBladderVolume` : b_si_floor 로직 이식 (Python 1316-1321).
  * `applyLumenInsetOne` Double 오버로드 신규.
- managers/AlignmentAdvisorV3.kt : buildRecord 가 estimateBv 사용.
- ui/views/clinical/ClinicalLiveView.kt : BV chip METHOD_D 가 estimateBv 사용.
- test/PrecisionDumpTest.kt : estimateBv 로 통일.
- test/CenterAlignerValidationTest.kt : cm=0/1 tolerance 0.02 (Python 완전
  일치), cm=3 는 0.10 (multi-trace edge case 잔존).

검증 (data123 cm=1 trace 0 first 10 cycles):
  volume_ml     : py=421.028293482 == kt=421.028293482  Δ=0.000000000  ★
  bottom_h_mm   : py= 20.059475664 == kt= 20.059475664  Δ=0.000000000  ★
  top_h_mm     : py= 10.441122871 == kt= 10.441122871  Δ=0.000000000  ★
  capBSiMm      : py= 47.049521628 == kt= 47.049521628  Δ=0.000000000  ★
  capCApMm     : py= 55.352378386 == kt= 55.352378386  Δ=0.000000000  ★
V3 CenterAligner: cm=0/1 bv_cv Python 완전 일치. cm=3 만 0.048 vs 0.130
(adaptive relax multi-trace edge case, 최종 cm=3 선택은 안정).

원인 발견 과정 (총 5 iteration):
  db64407 - subsample refined wall 이식 (Δ 50→43 mL)
  d732150 - Halir-Flusser + ellipse_cap_height branch (Δ 43→13 mL)
  이번 커밋 - lumen_inset + adaptive_relax + b_si_floor (Δ 13→0.000 mL) ★
2026-07-20 17:50:32 +09:00
..